O seguinte trecho de código falha com o gcc 8.5 até 10.5 com g++ -std=c++17
( https://godbolt.org/z/od99f93Tx ):
struct T { char arr[2]; };
int main()
{
T data;
data = { "V" };
return 0;
}
O erro é:
source>: In function 'int main()':
<source>:6:18: error: no match for 'operator=' (operand types are 'T' and '<brace-enclosed initializer list>')
data = { "V" };
^
<source>:1:8: note: candidate: constexpr T& T::operator=(const T&)
struct T { char arr[2]; };
^
<source>:1:8: note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const T&'
<source>:1:8: note: candidate: constexpr T& T::operator=(T&&)
<source>:1:8: note: no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'T&&'
Compiler returned: 1
Mas funciona no gcc 11.1 com o mesmo -std=c++17
sinalizador. Se você alterar o membro do array para algum outro tipo não array (como int ou qualquer outro), e substituir "V"
por algum valor compatível, é claro, funciona em todas as versões de 8.5 a 11. Foi um bug do gcc que foi corrigido no gcc 11, ou melhor, algum defeito padrão relacionado à inicialização agregada que não foi resolvido até mais tarde? Ou o quê?
Este é um bug do GCC, registrado como array char membro com inicializador literal de string que faz com que = {} falhe .
Parece ter se originado de mudanças no C++14.
Foi corrigido para GCC 11.