[表示 : 全て 最新50 1-99 101- 201- 301- 2chのread.cgiへ]
Update time : 05/10 09:44 / Filesize : 95 KB / Number-of Response : 338
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part60



1 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:43:34 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

52 名前:デフォルトの名無しさん [2008/01/16(水) 16:52:57 ]
下記のようにboost::arrayで代入演算子が定義されている型Tの2次元配列を
で作りたいのですが、BOOST_PPとtemlateで一般化できないでしょうか?
自分でも考えたのですが脳みそが沸騰しそうでした。

struct Row : public boost::array<T, XSIZE>
{
Row(T x0, T x1,..., T xXSIZE_minus1) : boost::array<T, XSIZE>()
{at(0) = x00; at(1) = x01;... at(XSIZE - 1) = xXSIZE_minus1;
};

const boost::array<Row, YSIZE> plane = {
Row(xx, xx, ... , xx),
...
Row(xx, xx, ... , xx)
};

53 名前:52 mailto:sage [2008/01/16(水) 16:56:53 ]
追記
const boost::array<Row, YSIZE> plane
は手書きで初期化します。一般化したいのはRowだけです

54 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 16:57:59 ]
教えてください
Borland社のフリーのコンパイラを使用してるのですが
#defineをmakefileでのコンパイラ時に宣言するときはどのような記述がいるのでしょうか?

55 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 17:08:05 ]
>>54
-D名前
-D名前=文字列

56 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 17:10:49 ]
>>55
無事できました、ありがとうございます

57 名前:デフォルトの名無しさん [2008/01/17(木) 17:56:37 ]
>>54-56
ほのぼのした.

58 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:25:38 ]
さてさて初心者が通りますよ。
今日から勉強しようと今、Visual C++ 2008 Express Editionをインストール中。

ここまでOKです。

59 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:27:07 ]
>>58
帰ってよし

60 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 01:44:30 ]
>>58
お前すごいな! VC2008をインスコしたのか
おれは、コンピラーすらインスコしてないよ
コンピラーぐらい、OSにおまけで付けて欲しいよな



61 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 03:00:22 ]
最近の,NET Frameworkインストール済みなWindowsだと
C#とかVB.NETのコンピラーがおまけで付いていますよ、と。

62 名前:デフォルトの名無しさん [2008/01/18(金) 10:03:24 ]
金毘羅ー

63 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 10:21:21 ]
emacsでc++するためのリンクを集めているのですが
d.hatena.ne.jp/niitsuma/20080114
他にも何か有用なサイトをご存じの方
お教えいただけると幸せです


64 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 14:16:25 ]
pc11.2ch.net/test/read.cgi/unix/1194747953/

65 名前:デフォルトの名無しさん [2008/01/19(土) 18:29:00 ]
C++好きですか?

66 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 19:33:18 ]
Cのスーパーセットらしい  →普通
クラスを使えると便利 →やや好き
難解な文法というか落とし穴にハマる →嫌いになる(この辺で多言語に浮気)
テンプレートがわかってくる →再び好きになる
STLに感動する →好きになる
bind1stとかvalarrayに不満がでてくる →再びちょっと嫌いになる
boostがわかってくる →また好きになる


67 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:03:21 ]
TMPができるようになる
 →何でもいいので何か自作のライブラリを作りたくなる

boostに追記/修正したくなる
 →何かを作る事よりもC++を書くこと自体が楽しくなる

既存のコンパイラに嫌気を射し
C++コンパイラを自分で作りたくなる
 →ちょっと飽きてくる

巨大なプログラムを作成中に過去に自分の書いたコードが読めなくなる
 →PCを窓から投げ捨てたくなる

68 名前:引っ越してきました [2008/01/19(土) 20:17:46 ]
VCスレからC++の問題ということで
追い出されて来ました。

クラスの中で+演算子を定義したいのですが、
newして、それをreturnの中で使いたいときに
deleteできないで困っています。
どうしたらよいでしょうか。

・簡単に言えば文字列の足し算です
・当方初心者です

friend Mojiretsu operator+=(const Mojiretsu& moji1, const Mojiretsu& moji2) {    // +演算子
  int tmp_nagasa = moji1.nagasa + moji2.nagasa ;
  char* tmp_moji = new char[tmp_nagasa+1];
  mojicpy(tmp_moji,moji1.s);
  mojicat(tmp_moji,moji2.s);
  return Mojiretsu(tmp_moji);
}

やりたいことはわかってもらえるとは思うのですが、
もっと楽にできるよとかもあったら教えてください。


69 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:23:50 ]
いろいろとおかしいなw

70 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:24:06 ]
Mojiretsu mojiretsu(tmp_moji);
delete[] tmp_moji;
return mojiretsu;

でどう?



71 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:44:36 ]
>>68
newしないでMojiretuを定義してそれをreturnすれば?
Effective C++でもnewはするなと書いてあったぞ。

72 名前:68 [2008/01/19(土) 20:45:00 ]
>>70
どうもです。
なるほど、コンストラクタを呼び出す、と。
実験の結果、ちゃんと動いています。
(まあ、もとのやつでも動いているようには
見えるのですが)


73 名前:68 [2008/01/19(土) 20:46:44 ]
>>71
どうもです。
少々時間ください。初心者のため
理解するのに時間がかかりますので。

74 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:51:27 ]
例外安全・・・についてはまだ触れない方がいいか
混乱しそうだし

75 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 20:52:05 ]
>>68
なんぜ+=なのに、moji1がconstなんだ?

Mojiretsu s1("abc"), s2("def");
s1 += s2;

これでs1 == "abcdef"にならないとおかしいだろ。

76 名前:68 [2008/01/19(土) 20:55:56 ]
訂正です。

ごめんなさい。
+=でなく、+です。

77 名前:68 [2008/01/19(土) 20:58:58 ]
>>71
やっぱりわかりません。
もう少しヒントください。

あと、Effective C++のどの辺でしょうか。
そのうち読もうと買ってはあります。

78 名前:68 [2008/01/19(土) 21:00:50 ]
>>74
とらいすろーきゃっち、でしょうか。
だいぶあとということでお願いします。


79 名前:68 [2008/01/19(土) 21:07:19 ]
>>71

どこが分からないかというと、
Mojiretuを定義するには、
(コンストラクタに)文字列(char*)を
渡す必要がありますが、その文字列自体、
strcatした後のものにしなければならず、
どうどうめぐりのようで
よく分からないのです。
勘違い、ご指摘くださいませ。


80 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:08:26 ]
>>77
誰がdeleteの責任持つの?って言う事。
それとEffective C++は
www.amazon.co.jp/Effective-%E3%80%90%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88%E3%80%91-
%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E3%82%A2%E3%82%B8%E3%82%BD%E3%83%B3%E3%82%A6%E3
%82%A7%E3%82%B9%E3%83%AC%E3%82%A4%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%E2%80%95Ascii-Addison-programming/dp/4756118089



81 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:09:09 ]
deleteは関数内で済ませてしまった方がいいだろう

82 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:12:07 ]
Effective C++持っているなら演算子の話を是非、
と思ったらMoreのほうだった……、22。

operator +よりもoperator +=を実装しろ。

そして、operator +はこうする。
Mojiretsu operator +(const Mojiretsu& lhs, const Mojiretsu& rhs)
{
  Mojiretsu tmp(lhs);
  return tmp += rhs;
}

83 名前:68 [2008/01/19(土) 21:16:53 ]
>>82
どうもです。
実はMoreも持っています。
また実験してみます。
(時間がかかります)

84 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 21:22:53 ]
std::vector使え

85 名前:68 [2008/01/19(土) 22:00:52 ]
>>82
ありがとうございました!
動きました!
+=を先に定義するというのは
頭いいですねえ。


86 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:12:44 ]
頭がいいっつうか、定石だな。

87 名前:68 [2008/01/19(土) 22:20:59 ]
>>86
そういうものなんですね。
>>82
「More」の22の最初のページの一番下に
「単独演算子がfriendである必要はまったくない」と
あり82でもfriendがついてませんが、friendにしないと、
lhsが"rerere"のような場合に私のではコンパイルエラーに
なったのですが、まだ何かおかしいということでしょうか。

88 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:24:53 ]
>>87
publicなコピーコンストラクタはあるか。
+=もメンバならやはりpublicになっている?

82のは、private/protectedなメンバに全く触っていないから
friendにする必要がないという仕掛け。

89 名前:68 [2008/01/19(土) 22:32:41 ]
>>88
たびたびありがとうございますです。
コピーコンストラクタも+=も+もその他すべての
メンバ関数はpublicになっているのですが。。。

90 名前:68 [2008/01/19(土) 22:37:36 ]
あ、もしかして、+は82そのままではなく、
privateメンバを触っていますがそのせいでしょうか。

Mojiretsu operator+(const Mojiretsu& str1, const Mojiretsu& str2) { // +演算子
    String tmp_moji(str1.s);  //←コンストラクタにはクラスの文字列部を渡してます
    tmp_moji += str2;
    return tmp_moji;
}




91 名前:68 [2008/01/19(土) 22:57:13 ]
friendがないと、
error C2804: binary 'operator +' に引数が多すぎます。
error C2333: 'Mojiretsu::operator +' : 関数宣言のエラーです。関数の本体は無視されます
っていうのも出たため、実験しましたが、
どの+でもエラーになってます。。。
friendつけている限りまったくwarningさえも出ないのですが。

すいません、時間切れです、明日の夕方、また来ます。

92 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 23:19:33 ]
>>91
来なくていいよ
もっと勉強してから来い

93 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 23:26:25 ]
>>91
迷惑です。もう荒らさないで下さい。

94 名前:68 [2008/01/20(日) 00:23:56 ]
大変おじゃまいたしました。
自己解決いたしました。
(error C2804でググって英文を読みました。
確かに読んでいる本ではコード上ちゃんと
なっていますがはっきりと言葉では
書いてないんですよねー、、、)

>>88
や、その他の方々、重ね重ねありがとうございました。
大変勉強になりました。

95 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 00:48:41 ]
>>94
とりあえず次回のためには自己解決の意味を覚えとけ。

96 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 02:31:03 ]
でもクラス定義内でfriend関数を定義できるのは盲点だったと思っている。

97 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 09:50:57 ]
>>96
最初から知っていた俺がいる。
ただ、ADLでしかlookupできないというのは盲点だったと思っている。

98 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 11:39:38 ]
slashdot.jp/it/07/05/24/2257258.shtml?tid=58
終わってるスキルtop10にCが入ってる
c++と区別してcなのか、それともc++込みで終わってるのか

99 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:12:16 ]
>>98
そいつバカですね。Cが終わってるなら、C++では重過ぎて
実装できない組み込み機器はどうなるのか?

100 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:31:48 ]
アセンブラはリストされてないから大丈夫じゃないか?



101 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 12:59:28 ]
古いネタの揚げ足とってどうすんだよwww

102 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:24:19 ]
>>98
> c++と区別してcなのか、それともc++込みで終わってるのか
スラドのくだらない雑談はいいから元の記事嫁よ
って元の記事もかなりくだらないな

103 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:04:17 ]
C++のコーディング方法について質問です。
皆さんは、コーディング中にコメントアウトを使うでしょうか?
以前、仲間内でコメントアウトの是非で議論になりました。
私の知人はコメントアウトを使用する派で、私は使用しない派です。
皆さんは、コメントアウトの是非についてどう思うかお聞かせください。
なお、開発はVC++6.0、2003、2005などで行っています。

ちなみに、私がコメントアウトを否定する理由は
1.ソースが汚くなるから。
2.バックアップなら、zipか何かにまとめてプロジェクトごとバックアップしておいた方が良いから。
の二点です。

よろしくお願いします。

104 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:38:02 ]
コーディングスタイルはスレ違い。

コーディングスタイルにこだわるスレ
pc11.2ch.net/test/read.cgi/tech/1193554741/

105 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 06:53:46 ]
(コメントがしきい値以下です。)

106 名前:デフォルトの名無しさん [2008/01/21(月) 20:38:50 ]
C++は難しすぎ 難易度:2
pc11.2ch.net/test/read.cgi/tech/1071697977/

107 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 17:37:57 ]
英語圏向けblogでd.hatenaみたいにシンタックスハイライトできるblogないでしょうか?

108 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 17:45:39 ]
スレタイ嫁

109 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 23:33:33 ]
C++で作ればいーじゃない。

110 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 02:43:19 ]
std::cerrやstd::wcerrの<<オペレータが例外を投げるケースは存在するのでしょうか?
これらをcatch文の中で使っても安全なのでしょうか?



111 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 08:49:57 ]
>>110
標準ができる前に既にI/Oライブラリは存在していて、後方互換性
のためデフォルトではストリームは例外を投げない仕様だと思った。
exceptionメンバー関数を使ってストリームの各種状態を例外ハンドリング
に変えることは可能。

112 名前:111 mailto:sage [2008/01/23(水) 08:50:46 ]
ユーザー定義型についてはoperator<<,>>で何をやるかによると思うけど。

113 名前:110 mailto:sage [2008/01/23(水) 14:51:51 ]
>>111
basic_ios::exceptionsの存在に初めて気付きました。
おかげですっきりいたしました。
ありがとうございます。

114 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:24:22 ]
C++ で new されたオブジェクト(o)とクラス(CLS)が与えられたときに、
そのオブジェクトが CLS クラスのオブジェクトか判定するには
どうすればできますか?

115 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:28:43 ]
>>114
typeid演算子

116 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:34:33 ]
クラスをCLSと表すあたり、COMのCLSIDじゃないかとエスパーしてみる。

117 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 17:11:05 ]
>>115
thx

>>116
組込みですよ。

118 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:01:08 ]
直接dynamic_castで済むこともあるけどな。

119 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:30:52 ]
ただ、dynamic_cast と typeid は意味がちゃうよね。
dynamic_cast はキャスト可能な全ての型で判定が成功するけど、
typeid は(& とトップレベルの const 以外は)厳密に型が一致しないとダメ。
どっちの方がいいというのではなくて目的ごとに使い分けることになるから、
>>114 がどっちの判定がやりたいかによるね。

120 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:40:58 ]
dynamic_castは多相型のポインタとリファレンスにしか適用できないし。



121 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 19:05:22 ]
そうなるとそもそも仮想関数をうまく使えば
dynamic_castも要らないだろというところまで話を広げたくなるね。

122 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 19:28:59 ]
今は typeid で分岐するのが流行りなんだぜ?

123 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 19:50:25 ]
dynamic_cast じゃなくて typeid が必要になる状況ってあんま想像つかない。
どういう時に使うんだ?

124 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:03:45 ]
デバッグ用途とかコードジェネレータとか

125 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:35:54 ]
参照への参照
int& &

この表記はC++03では認められていませんが、C++0xではint&と等価なものとして
仕様が改定されることは決定済みなのでしょうか?

126 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:52:58 ]
ドラフトには入ってたと思うよ

127 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 22:53:45 ]
ただし、テンプレート引数が参照な時だけだっけ?

&& を素で書くと右辺値参照だったはず。

128 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 23:52:55 ]
>>126
>>127
そうですか。テンプレートパラメータが既に参照の場合、
参照引数を渡すとT& &となりエラーとなるため、これを
回避することだけを目的としてるのかもしれないですね。
type functionを書くのも面倒なので是非改定
してもらいたいです。もしかすると今でもBoostでは便利
なものがあるかもしれませんが。

右辺値参照はC++03では認められていなくて、C++0xでは
正当になる予定ですよね?

129 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:15:13 ]
あれ? 離して書くと大丈夫だったかもしれん。
うろ覚えだからドラフト読んでくり。

130 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:24:22 ]
>>129
確認してみます。



131 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:34:53 ]
参照への参照なんて使うことあるの?

132 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:47:44 ]
>>131
テンプレートでこねこねしていると、うっかり参照への参照という型が生まれることがある。
そんなもの、現状ではコンパイルエラーだが、125に書いてある通り0xだと、
Tへの参照への参照型は、単にTへの参照型として扱われるようになる。

133 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:00:12 ]
&  &     -> &
&  &&   -> &
&&  &   -> &
&&  && -> &&

134 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:01:32 ]
>>132
thx うっかり、ってことは積極的に作るものじゃないって事でOK?

135 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:19:02 ]
www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm#s7

www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1377.htm#References%20to%20References

このあたりかな。あまり理解できなかった。
改定理由はテンプレートパラメータの問題としてだけでなく、
右辺値参照との絡みもあるみたいだ。かな?

136 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:35:59 ]
&&& はwell-formedなのか気になる

137 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:39:01 ]
ill

138 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:58:45 ]
>>135
template<typename T1, typename T2, typename T3>
void f(T!&& x, T2&& y, T3&& y);
例えば、こんな関数にboost::refで一部の引数だけ左辺値参照にすることができる。
そんなことできて何が嬉しいって、例えばBoost.BindやBoost.Lambdaの関数呼出。

これは& &→&というより、&& &→&の説明になっているけど。

139 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 13:40:10 ]
別に boost::ref などを使わなくても,
普通に左辺値を引数にすれば左辺値参照として bind されるのでは?

140 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:22:36 ]
くわしく



141 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 02:32:53 ]
以下抜粋
1. lvalues can bind to an rvalue reference.

2.
struct A {};

void h(const A&);
void h(A&&);

void g(const A&);
void g(A&&);

void f(A&& a)
{
g(a); // calls g(const A&)
h(a); // calls h(const A&)
}

Although an rvalue can bind to the "a" parameter of f(), once bound, a is now treated as an lvalue.

>>139の言うとおりのような気がする。

142 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:02:29 ]
そもそもboost::refをなくすための&&ですやん

143 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:17:13 ]
いや、&&はmove semanticsのためでしょ。
boost::refはoutパラメータとして使うためにあるんだと思ってる。

144 名前:139 mailto:sage [2008/01/25(金) 13:52:28 ]
以下 C++0x の話で現行の言語規格とは一切関係ないです.スレ違いですいません.

>>141
あ,いえ,自分が>>139で指摘したかったのはたとえば

template<typename T>
void f(T &&x);

があったときに, f を左辺値で呼び出すと T が左辺値参照型で specialize されて
f のパラメタの型が左辺値参照型になる,つまり

int i;
f(i);    // T = int & として f が specialization される.
        // 結果 f のパラメタの型が & && -> & の decay を受けて int & と同等になる
f(42); // T = int として f が specialization される.
        // 結果 f のパラメタの型が右辺値参照型 int && になる

ということです.これによって f の引数が非 const 左辺値でも const 左辺値でも右辺値でも
問題なく受けられるようになるということを指摘したかったんです.

で,上記の仕様 (引数が左辺値か右辺値かで
テンプレートパラメタ T が参照型かそうでないかの違いが生じる) から,
f の実装内部において f が左辺値で呼ばれたのか右辺値で呼ばれたのかの識別も可能となります.

この 右辺値参照・参照型の decay ルール・関数テンプレートにおける引数推論規則 の組み合わせで
the forwarding problem が完全に解けるというのが現在の提案の骨子だったかと思います.

145 名前:139 mailto:sage [2008/01/25(金) 13:54:25 ]
あと,実際には>>141さんが指摘しているように
名前が付いた右辺値参照は左辺値として扱われるので,
右辺値として渡された f の引数を f の内部で引き続き右辺値として扱うには
明示的に右辺値参照に変換してやらないといけないです.
で,このために std::forward という補助的な関数テンプレートも提案されています.

template<typename T>
T &&forward(typename identity<T>::type &&x){return x;}

template<typename T>
void f(T &&x)
{
  g(forward<T>(x)); // f が右辺値で呼ばれている場合, T が非参照型になっているので
                         // forward の戻り値型が右辺値参照型になり,右辺値として g に渡される.
                         // f が左辺値で呼ばれている場合, T が参照型になっているので
                         // forward の戻り値型が左辺値参照型になり,左辺値として g に渡される.
}

146 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 15:50:00 ]
>>143
boost::refについて、これ嘘だった。


147 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:25:54 ]
まったく話についてけないんだが。
何が左辺値で何が右辺値なんだかもうわけわからん
右辺値で呼ぶってどういうこと?

148 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:44:11 ]
template <class T>
struct identity
{
typedef T type;
};

template <class T>
inline
T&&
forward(typename identity<T>::type&& t)
{
return t;
}


149 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:49:21 ]
>>144
f(i); // T = int & として f が specialization される.

T が int & にdeductionされるのって、パラメータが右辺値参照
のときのみのルールですよね?

150 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 16:52:33 ]
Let us first consider the rvalue reference type, T &&, in more detail in
the context of the C++ type system. What if T is itself a reference
type? Template libraries have been known to create reference to
reference types via typedefs or type manipulations. According to the
proposed resolution to Core Defect Report 106 , ordinary references obey
the equality T cv1 & cv2 & == T cv12 &, where cv12 is the union of cv1
and cv2. A similar reasoning can be applied to collapse two rvalue
references into one: T cv1 && cv2 && == T cv12 &&.

こいう文書で出てくるcv1やcv2やcv12の数字は何を意味してるんですか?




151 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 17:25:21 ]
区別するため便宜的に番号を振っているだけ。
例えばcv1 = const, cv2 = volatileなら、
vc12 = const volatileだよという話をしたいがためのもの。

152 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 18:57:19 ]
>>151
なるほど。unionは合成の意味ですね。てっきりキーワードもunionかと
思ってしまいました。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<95KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef