Comportamento diferente de g ++ 4.9 e g ++ 5 ao restringir na lista de inicialização
Considere este código:
#include <iostream>
int main()
{
int i{10.1}; // narrowing, should not compile
std::cout << i << std::endl;
}
De acordo com o padrão C ++ 11, ele não deve ser compilado (é proibido restringir a inicialização entre chaves).
Agora, compilando comg++4.9.2 -std=c++11
apenas emite um aviso
warning: narrowing conversion of '1.01e+1' from 'double' to 'int' inside { } [-Wnarrowing]
Removendo o-std=c++11
flag resulta em um aviso sobre o colchete init, mas não em nenhum estreitamento:
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
Por outro lado, g ++ 5não compila, desde que você compile comg++5 -std=c++11
. No entanto, se-std=c++11
é omitido, mesmog++5
o compila alegremente, dando apenas um aviso relacionado ao init brace, não ao estreitamento:
warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
O comportamento acima parece com erros,g++4.9
não deve compilar o código, e é mais do que estranho queg++5
compila se você esquecer de especificar-std=c++11
. É um problema conhecido?