C++中静态常量成员变量与收缩转换的关系

Relation between static constant member variables and narrowing conversions in C++

使用 GCC 编译器在 C++20 中编码。

根据下面显示的代码,由于 intchar 的隐式转换,程序将引发收缩转换 error/warning。但是,如果我将 static const/constexpr 添加到 int var {92}; 行,程序运行时不会引发任何 errors/warnings.

  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();
} 

Why does this happen?

因为list initialization (since C++11) prohibits narrowing conversions.

(强调我的)

  • conversion from integer or unscoped enumeration type to integer type that cannot represent all values of the original, except where source is a constant expression whose value can be stored exactly in the target type

如果你将 var 声明为 static const/constexpr,它变成一个常量表达式并且值 92 可以存储在 char 中,那么代码可以正常工作。