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á umreturn
ed 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 é?