このプログラム:
#include <iostream>
struct T {
T() {}
T(const T &) { std::cout << "copy constructor "; }
T(T &&) { std::cout << "move constructor "; }
};
int main() {
([](T t) -> T { return t; })({}); std::cout << '\n';
([](T t) -> T { return void(), t; })({}); std::cout << '\n';
([](T t) -> T { return void(), std::move(t); })({}); std::cout << '\n';
}
gcc-4.7.1出力(リンク)でコンパイルした場合:
move constructor
copy constructor
move constructor
なぜコンマ演算子がこの効果をもたらすのですか?標準は言う:
5.18コンマ演算子[expr.comma]
1-[...]結果のタイプと値は、右のオペランドのタイプと値です。結果は、右のオペランド[...]と同じ値のカテゴリになります。右のオペランドの値が一時的なものである場合、結果はその一時的なものになります。
コンマ演算子がプログラムのセマンティクスに影響を与えることを可能にする何かを見逃したことがありますか、それともこれはgccのバグですか?