Przenieś konstruktor pominięty przez operatora przecinka

Ten program:

#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';
}

po skompilowaniu przez wyjścia gcc-4.7.1 (połączyć):

move constructor 
copy constructor 
move constructor 

Dlaczego operator przecinka ma ten efekt? Standard mówi:

5.18 Operator przecinka [expr.comma]

1 - [...] Typ i wartość wyniku to typ i wartość prawego argumentu; wynik jest tej samej kategorii wartości, co prawy operand [...]. Jeśli wartość prawego operandu jest tymczasowa, wynik jest tymczasowy.

Czy przegapiłem coś, co pozwala operatorowi przecinka wpływać na semantykę programu, czy może jest to błąd w gcc?

questionAnswers(2)

yourAnswerToTheQuestion