我知道将整数值分配给有符号字符是个坏主意并且容易出错,例如分配返回值 - 从 std::cin.peek()
, std::cin.get(void)
到 {{1} }.
例如:
char
如果我使用带有 char c = 255; // Undefined Behavior. (overflowing a singed char)
标志的 GCC 编译它,我会收到警告:
pedantic
。
没关系,感谢编译器发出警告。
但考虑一下:
warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘255’ to ‘'\37777777777'’ [-Woverflow]|
为什么编译器不抱怨将 char c;
if( (c = std::cin.peek()) == '\n')
std::cout << "end of line char detected!\n";
和 std::cin.get()
的返回值分配给 std::cin.peek()
类型的 c
?
我使用相同的编译器和相同的标志进行编译。
这是否意味着因为从非 constexpr 函数返回的值仅在运行时才知道,这就是编译器不兼容的原因。
我认为我的猜测是正确的,考虑一下:
char
现在因为函数 constexpr int f(){return 255;}
int main(){
char c = f();
}
是 f
,编译器在编译时而不是在运行时评估它,所以它知道它正在溢出 constexpr
,因此它产生警告。
这类似于访问 char
等容器的元素,当索引仅在运行时已知时,编译器不会产生任何警告,因为索引的值尚未存在编译时。
我的猜测是真的吗?