Эта программа:
#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 Comma operator [expr.comma]
1 - [...] Тип и значение результата - это тип и значение правого операнда; результат имеет ту же категорию значений, что и ее правый операнд [...]. Если значение правильного операнда является временным, результатом является временное.
Я пропустил что-то, что позволяет оператору запятой влиять на семантику программы, или это ошибка в gcc?