É inicialização direta ou inicialização de cópia?
A inicialização de objetos (instâncias de classes ou estruturas) em C ++ pode ser feita de várias maneiras. Algumas sintaxes evocam umainicialização direta do seu objeto, outras sintaxes levam a uminicialização de cópia. Comcópia-elisão ativado no compilador, ambos têm desempenho idêntico. Comcópia-elisão desativado, há uma chamada adicional do construtor de copiar / mover a cada instancia quando você escolhe o último (inicialização de cópia).
Conclusão: a inicialização de cópia pode ter uma penalidade de desempenho!
Da seguinte pergunta:C ++ 11 lista inicializador de membros vs inicializador de classe? Eu posso concluir que isso seriainicialização de cópia sintaxe:
obj s = obj("value");
E isso seriainicialização direta sintaxe:
obj s{"value"};
Mas e esse:
obj s = {"value"};
E este:
obj s = obj{"value"};
E este:
obj s("value");
Ou este:
obj s = "value";
NOTA
Bjarne Stroustrup compara alguns estilos de inicialização (mas não todos) em seu livro "Programação, princípios e práticas usando C ++", 2ª edição, na página 311, §9.4.2:
struct Date {
int y,m,d; //year, month, day
Date(int y, int m, int d); //check for valid date and initialize
void add_day(int n); //increase the Date by n days
};
...
Date my_birthday; //error: my_birthday not initialized
Date today{12,24,2007}; //oops! run-time error
Date last{2000,12,31}; //OK (colloquial style)
Date next = {2014,2,14}; //also OK (slightly verbose)
Date christmas = Date{1976,12,24}; //also OK (verbose style)
O Sr. Stroustrup apresenta esses diferentes estilos de inicialização como iguais. Pelo menos, é assim que me parece. No entanto, ainda é possível que alguns sejaminicialização direta e outrosinicialização de cópia, uma vez que esses termos ainda não foram discutidos nesse ponto do livro.
EDITAR
As respostas dadas trazem algo interessante.
Aparentemente, isso éinicialização direta:
obj s("value");
E isso éinicialização direta da lista:
obj s{"value"};
Como alguns de vocês apontam, há uma diferença. De que maneira eles realmente diferem? A diferença seria perceptível na saída de um compilador não otimizador?