comp.std.c++ Usenet の議論が非常に信頼できなくなったため、ここに再投稿します。私がそこに提出した最後のいくつかの投稿は無効になり、活動はほとんど停止しました. 私が禁止されているか、他の人が興味を失ったのではないかと思います。興味のあるすべての人がこの議論を見つけて、一般的な移行が行われることを願っています。たぶん、彼らは新しいモデレーターを任命するでしょう。
こんにちは!
条件演算子と xvalues に関するドラフト N3126 の私の現在の解釈では、次のアサーションが保持されると予想されます。
int i = 0;
int& j = true? i : i;
int&& k = true? std::move(i) : std::move(i); // #2
assert(&i == &j); // Holds since C++98
assert(&i == &k); // Should this hold as well?
5.16/4 言います:
[条件演算子への] 2 番目と 3 番目のオペランドが同じ値カテゴリの glvalue で、同じ型の場合、結果はその型と値カテゴリになります [...]
ただし、結果の glvalue が glvalue オペランドが参照するオブジェクトの 1 つを参照することを明確に述べているわけではありません。C++0x モードで GCC 4.5.1 を使用すると、2 番目のアサーションが失敗します。参照 k は、何らかの一時オブジェクトを参照しているようです。コロンの周りの両方のオペランドが同じタイプの xvalue である場合に、コミラーがそのような一時的なものを作成できるかどうかを誰かが明確にすることはできますか?
私は現在、GCC にバグがあるか、xvalue に関して最新ではないことを想定しています。
フォローアップの質問は、次のとおりです。式の値カテゴリを検出できたらいいと思いませんか? 条件演算子を無視すると、decltype を使用して式の値カテゴリを検出できます。しかし、何が
bool xvalue = std::is_rvalue_reference<
decltype( true ? std::move(i) : std::move(i) ) >::value;
譲るべきか?GCC 4.5.1 を使用すると、xvalue 変数は false で初期化されます。これは現在の標準草案に準拠していますか?
ティア、セバスチャン