s subobjetos dos membros das variáveis locais também serão movidos se retornados de uma funçã

O padrão C ++ 11 afirma que, se as condições para a remoção da cópia forem atendidas §12.8/31), a implementação tratará umreturned variável local lvalue e parâmetros de função, como um rvalue primeiro (movimento) e se a resolução de sobrecarga não for bem-sucedida como detalhado, deve tratá-lo como um lvalue (cópia).

§12.8 [class.copy] p32

Quando os critérios para a eliminação de uma operação de cópia forem atendidos ou serão atendidos, exceto pelo fato de o objeto de origem ser um parâmetro de função,e o objeto a ser copiado é designado por um lvalue, a resolução de sobrecarga para selecionar o construtor da cópia é realizada primeiro como se o objeto fosse designado por um rvalue. Se a resolução de sobrecarga falhar, ou se o tipo do primeiro parâmetro do construtor selecionado não for uma referência de rvalor ao tipo do objeto (possivelmente qualificado para cv), a resolução de sobrecarga será executada novamente, considerando o objeto como um lvalor. Nota Essa resolução de sobrecarga em dois estágios deve ser executada, independentemente da ocorrência de elisão da cópia. Determina o construtor a ser chamado se a elisão não for executada e o construtor selecionado deve estar acessível, mesmo que a chamada seja evitada. - enviar nota ]

Isso também inclui subobjetos de membros? Eu testei com o seguinte snippet:

#include <iostream>

struct traced{
  traced(){ std::cout << "default ctor\n"; }
  traced(traced const&){ std::cout << "copy ctor\n"; }
  traced(traced&&){ std::cout << "move ctor\n"; }
};

struct X{
  traced t;
};

traced f(){
  X x;
  return x.t;
}

int main(){
  traced t = f();
}

xemplo ao vivo no Ideon E nem o GCC 4.7 ToT nem o Clang 3.1 ToT exibirão "move ctor", o que me leva a acreditar que o padrão não inclui subobjetos de membro

Eu ignorei algo? Meu código de teste está quebrado? O que exatamente faz com que a saída seja como é?

questionAnswers(2)

yourAnswerToTheQuestion