Mover o construtor suprimido pelo operador de vírgula

Este programa:

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

quando compilado pelas saídas do gcc-4.7.1 (ligação):

move constructor 
copy constructor 
move constructor 

Por que o operador de vírgula tem esse efeito? O padrão diz:

5.18 Operador de vírgula [expr.comma]

1 - [...] O tipo e valor do resultado são o tipo e valor do operando direito; o resultado é da mesma categoria de valor do seu operando direito [...]. Se o valor do operando direito for temporário, o resultado será temporário.

Eu perdi algo que permite ao operador de vírgula afetar a semântica do programa, ou isso é um bug no gcc?

questionAnswers(2)

yourAnswerToTheQuestion