这个程序:
#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 中的错误?