inicializando struct com {0}

8

Estou depurando algum código que é essencialmente idêntico a isso:

struct Foo { int a; int b; };
struct Bar { Bar() {} Foo foo{0}; };

Quando eu faço uma instância de Bar, parece que ambos ae bsão inicializados com zero. Isso é garantido? Onde posso encontrar isso nas especificações?

XPlatformer
fonte
try: struct Foo { int a{}; int b{}; };lembre-se das chaves extras após os nomes das variáveis. você sempre obterá valores inicializados. se você precisa para o init com outros valores, com comportamento definido, você precisa escrever um ctor como para uma todas as outras classes
skratchi.at
@ skratchi.at Aqueles que não são parênteses (usando parênteses significaria outra coisa)
Leveza raças na órbita
1
Uma pergunta tão simples na superfície, mas o C ++ init é tão complicado que eu entendo por que você está fazendo isso. Eu poderia arriscar um palpite de que você está recebendo o init agregado adequado aqui, mas sem se aprofundar no padrão, não tenho certeza de qual é a resposta. Que triste?
Lightness Races em órbita
Isto é para matrizes, mas ... stackoverflow.com/questions/1065774/…
YSC
Outra pergunta semelhante: stackoverflow.com/questions/1069621/…
Frodyne 28/10

Respostas:

3

De acordo com cppreference.com

Se o número de cláusulas do inicializador for menor que o número de membros [e bases (desde C ++ 17)] ou a lista de inicializadores estiver completamente vazia, os membros restantes [e bases (desde C ++ 17)] serão inicializados [por seus inicializadores de membros padrão, se fornecidos na definição de classe e de outra forma (desde C ++ 14)] por listas vazias, de acordo com as regras usuais de inicialização de lista (que executa a inicialização de valor para tipos que não são de classe e classes não agregadas) com construtores padrão e inicialização agregada para agregados). Se um membro de um tipo de referência for um desses membros restantes, o programa será mal formado.

Fooinicializadores não tem membro padrão ( int b{0};), então bserão inicializados por uma lista-de inicialização com uma lista vazia, o que significa valor de inicialização para tipos não-classe: b = int() // = 0.

eike
fonte