mecanismo de invocação de construtor

struct my { my(){ std::cout<<"Default";} my(const my& m){ std::cout<<"Copy";} ~my(){ std::cout<<"Destructor";} }; int main() { my m(); //1 my n(my()); //2 } 

Produção esperada:

 1 ) Default 2 ) Copy 

Saída real:


O que há de errado com meu entendimento do mecanismo de invocação do construtor?

Note que omiti arquivos de header por brevidade.

Caso 1)

m é interpretado como uma function que retorna my e não aceita argumentos. Para ver a saída esperada remove () ou seja, use my m;

Caso 2)

Isso é algo mais conhecido como o “mais irritante”.

n é interpretado como uma function que retorna my que leva um argumento do tipo ponteiro para function retornando my tendo sem argumentos.

Para ver a saída esperada, neste caso, tente my n((my())); [Em vez de tratar como uma especificação de argumento como no primeiro caso, o compilador agora o interpretaria como uma expressão por causa do extra () ]

Minha interpretação:

my n((my())) é equivalente ao my n = my() . Agora a expressão rvalue my() cria um temporário [ou seja, uma chamada para o construtor padrão] n é uma cópia inicializada para aquele object temporário [nenhuma chamada para o copy-ctor devido a alguma otimização do compilador ]

PS : Eu não tenho 100% de certeza sobre a última parte da minha resposta. Corrija-me se eu estiver enganado.

Como o Prasoon, eu suspeito que o compilador C ++ esteja analisando seu código de uma forma que você não espera. Por exemplo, acho que está analisando a linha

 my m(); 

como uma declaração de protótipo de function, não como uma declaração de variável e chamada para o construtor – daí porque você não vê saída.