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?


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.