C++ 常量强制转换在常量表达式中有效吗?(C+;+;14,C+;+;17)
a遇到的具体问题是编译器处理它的方式存在一些不一致性 例如,此代码():C++ 常量强制转换在常量表达式中有效吗?(C+;+;14,C+;+;17),c++,language-lawyer,constexpr,const-cast,constant-expression,C++,Language Lawyer,Constexpr,Const Cast,Constant Expression,a遇到的具体问题是编译器处理它的方式存在一些不一致性 例如,此代码(): constexpr自动值=1; 静态断言(*const_cast(&value),“值应为1”); 使用GCC、Clang和MSVC编译精细,但英特尔C++编译器19.0.1失败,错误如下: error: expression must have a constant value static_assert(*const_cast<int *>(&value), "value should be 1"
constexpr自动值=1;
静态断言(*const_cast(&value),“值应为1”);
使用GCC、Clang和MSVC编译精细,但英特尔C++编译器19.0.1失败,错误如下:
error: expression must have a constant value
static_assert(*const_cast<int *>(&value), "value should be 1");
错误:表达式必须具有常量值
静态断言(*const_cast(&value),“值应为1”);
据我所知,标准没有明确规定常量表达式中不允许使用const\u cast
。通过结果指针写入将是未定义的,因此不允许,但读取应该是可以的
<> P>考虑到所有主要编译器编译该代码(包括ICC<19.0.1),它可能只是ICC 19.0.1. ./P>< P>中的一个常数。在C++中的常量表达式中可能或可能不出现的是由表达式的黑名单或表达式的属性定义的。完整清单见[解释常数]一节第2段。列表中没有任何内容禁止
const\u cast
本身。就我所知,唯一相关的一点是
左值到右值的转换,除非应用于
- 整型或枚举型的非易失性glvalue,它引用具有前一个 初始化,使用常量表达式初始化,或
- 引用字符串文字的子对象的非易失性glvalue,或
- 一种非易失性glvalue,它引用用constexpr定义的非易失性对象,或引用此类对象的不可变子对象 反对,或
- 一种文本类型的非易失性glvalue值,指的是一个非易失性对象,其生存期开始于
的计算范围内e
*
运算符生成一个左值。所述左值不是易变的,并且指的是constepr
对象(value
)。因此,您的代码是有效的C++。