C++中静态常量成员变量与收缩转换的关系
Relation between static constant member variables and narrowing conversions in C++
使用 GCC 编译器在 C++20 中编码。
根据下面显示的代码,由于 int
到 char
的隐式转换,程序将引发收缩转换 error/warning。但是,如果我将 static const/constexpr
添加到 int var {92};
行,程序运行时不会引发任何 errors/warnings.
- 为什么会这样?
- 什么时候应该使用
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();
}
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
中,那么代码可以正常工作。
使用 GCC 编译器在 C++20 中编码。
根据下面显示的代码,由于 int
到 char
的隐式转换,程序将引发收缩转换 error/warning。但是,如果我将 static const/constexpr
添加到 int var {92};
行,程序运行时不会引发任何 errors/warnings.
- 为什么会这样?
- 什么时候应该使用
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();
}
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
中,那么代码可以正常工作。