constexpr int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
The snippet above:
Compiles with no warnings on
g++ 7
with-Wall -Wextra -Wpedantic
.Compiles with no warnings on
clang++ 4
with-Wall -Wextra -Wpedantic
.Fails to compile on
MSVC 2017
:conversion from 'const int' to 'unsigned int' requires a narrowing conversion
Q: is MSVC wrong here?
int i = 100;
struct F { F(unsigned int){} };
int main() { F{i}; }
Compiles with warnings on
g++ 7
with-Wall -Wextra -Wpedantic
:narrowing conversion of 'i' from 'int' to 'unsigned int'
Fails to compile
clang++ 4
with-Wall -Wextra -Wpedantic
:non-constant-expression cannot be narrowed from type 'int' to 'unsigned int' in initializer list
Fails to compile on
MSVC 2017
:conversion from 'const int' to 'unsigned int' requires a narrowing conversion
Q: is g++ wrong here? (i.e. should it produce an hard error?)
-pedantic-errors
, though as mentioned warnings are sufficient to meet the standard's requirements. – user743382