这个程序:
#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的一个bug?