Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 常量强制转换在常量表达式中有效吗?(C+;+;14,C+;+;17)_C++_Language Lawyer_Constexpr_Const Cast_Constant Expression - Fatal编程技术网

C++ 常量强制转换在常量表达式中有效吗?(C+;+;14,C+;+;17)

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"

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");
错误:表达式必须具有常量值
静态断言(*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++。