用c++ 20编写代码,使用GCC编译器
根据下面所示的代码,由于int
到char
的隐式转换,程序将引发一个缩小转换错误/警告。但是,如果我将static const/constexpr
添加到int var {92};
行,则程序运行时不会引发任何错误/警告。
- 为什么会发生这种情况?
- 我什么时候应该使用
static const/constexpr
成员变量? - 为什么不允许使用
constexpr
成员变量?
#include <iostream>
class Foo {
private:
int var {92};
public:
void bar() {
char chr {var};
std::cout << chr << 'n';
}
};
int main() {
Foo foo;
foo.bar();
}
为什么会发生这种情况?
因为列表初始化(c++ 11起)禁止窄化转换。
(强调我的)
- 从整数或无作用域枚举类型转换为不能表示原始的所有值的整数类型,除非source是一个常量表达式,其值可以完全存储在目标类型中
如果将var
声明为static const/constexpr
,它就变成了一个常量表达式,并且值92
可以存储在char
中,那么代码就可以正常工作了。