Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why compiler allows narrowing conversions

Tags:

c++

c++11

Can anyone please explain to me, why the compiler allows initialize variables of built-in type if the initializer might lead to the loss of information?

For example C++ Primer, the 5th edition says, that The compiler will not let us list initialize variables of built-in type if the initializer might lead to the loss of information.

but my compiler gcc v 4.7.1 initialized variable a in the following code successfully:

long double ld = 3.1415926536; 
int a{ld};

there was just warning: narrowing conversion of ‘ld’ from ‘long double’ to ‘int’ inside { } [-Wnarrowing].

like image 449
vladinkoc Avatar asked Oct 13 '12 14:10

vladinkoc


2 Answers

One of the features of initializer lists is that narrowing conversions are not allowed. But the language definition doesn't distinguish between warnings and errors; when code is ill-formed it requires "a diagnostic", which is defined as any message from a set of implementation-defined messages. Warnings satisfy this requirements. That's the mechanism for non-standard extensions: having issued a warning, the compiler is free to do anything it wants to, including compiling something according to implementation-specific rules.

like image 123
Pete Becker Avatar answered Nov 07 '22 15:11

Pete Becker


You can set the compiler flag to flag all warnings as error. In that case only it will stop you from doing like that. Otherwise it will only be a warning.

like image 40
Ashish Yadav Avatar answered Nov 07 '22 17:11

Ashish Yadav