Contexto:
Em C++, é possível criar uma referência a uma "matriz de limites desconhecidos".
Exemplo:const char (&)[]
Antes do C++20, o clang (14.x, 18.x) não permitia que você coagisse uma referência a uma matriz de limites conhecidos para uma referência a uma matriz de limites desconhecidos e falharia com um erro:
referência ao tipo incompleto 'const char[]' não pôde ser vinculada a um lvalue do tipo 'const char[5]'
Para C++20, o clang agora permite isso.
O gcc, por outro lado, sempre permitiu isso, desde o C++98.
Questões:
- Isto é apenas uma discordância sobre padrões?
- Algum deles estava errado?
- O C++20 mudou ou esclareceu o padrão que torna isso mais claramente válido?
Exemplo
https://godbolt.org/z/66sh8a5z1
int main() {
using StringLitRef = const char (&)[];
StringLitRef array = "derp"; // works on g++ for any standard and clang with c++20
return 0;
}