Neste exemplo, a última linha falha na compilação. Entendo o porquê, mas me pergunto como posso fazer o compilador entender que quero chamar Class(const int &)
para criar uma instância sem nome, em vez de tentar chamar o construtor padrão indefinido e criar uma instância chamada i
:
struct Class {
Class(const int &) {}
};
void foo() {
int i;
// Works
Class(int(i));
// Fails
Class(i);
}
Erro no MSVC:
C2371 'i': redefinition; different basic types
E0291 no default constructor exists for class "Class"
Você precisa usar a inicialização entre chaves para que a gramática não pense que você está tentando criar um objeto chamado
i
do tipoClass
. Para você, isso significacriará um objeto temporário sem nome que será destruído no final da expressão completa.
Outra opção:
(Class(i));
Os colchetes podem ter semântica diferente dos parênteses em alguns casos (não no seu), e prefiro não pensar nisso em geral.