c++中静态常量成员变量与窄化转换之间的关系



用c++ 20编写代码,使用GCC编译器

根据下面所示的代码,由于intchar的隐式转换,程序将引发一个缩小转换错误/警告。但是,如果我将static const/constexpr添加到int var {92};行,则程序运行时不会引发任何错误/警告。

  1. 为什么会发生这种情况?
  2. 我什么时候应该使用static const/constexpr成员变量?
  3. 为什么不允许使用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中,那么代码就可以正常工作了。

最新更新