std::addressof作为C++17中的常量表达式
std::addressof as a constant expression in C++17
std::addressof
的规范已针对C++17进行了更改:现在允许它是一个常量表达式。然而,cppreference说:
表达式
std::addressof(E)
是常量子表达式,如果E
是左值常量子表达式。
- 什么是常量子表达式
std::addressof(E)
将是一个常数表达式的例子是什么std::addressof(E)
将不是常量表达式的示例是什么
这里对此进行了解释。
在17.3中的现有列表中引入以下新定义[定义]:[起草说明:如果在此之前接受LWG 2234问题,应该使用新定义的公认措辞相反--结束起草说明]
**constant subexpression** [defns.const.subexpr] an expression whose evaluation as a subexpression of a *conditional-expression* *CE* (5.16 [expr.cond]) would not prevent *CE* from being a core constant expression (5.20 [expr.const]).
所以"常量子表达式"大致意思是"可以在常量表达式中使用它"。
std::addressof(E)将是一个常量表达式的例子是什么?
我相信它的目的是在&E
调用时给出一个常量表达式(假设&
调用运算符的内置地址)。
constexpr int x = 42; // static storage duration
constexpr int* p1 = &x; // x is an lvalue constant subexpression
constexpr int* p2 = std::addressof(x); // x is an lvalue constant subexpression
std::addressof(E)不是常量表达式的例子是什么?
std::map<int, int> m;
void f() {
int& r = m[42];
constexpr int* z1 = &r; // error: r is not a constant subexpression
constexpr int* z2 = std::addressof(r); // likewise
constexpr int x = 43; // automatic storage duration
constexpr const int y1 = *&x; // ok; x is a constant subexpression
constexpr const int y2 = *std::addressof(x); // likewise
constexpr const int* p1 = &x; // error: p1 points to an automatic object
constexpr const int* p2 = std::addressof(x); // likewise
}
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 使用自动推导的 lambda 参数作为常量表达式
- 生成提升::hana::set 的常量表达式问题
- 为什么不能用常量表达式声明数组?
- 不是 lambda 函数中的常量表达式
- 函数调用在常量表达式中必须具有常量值
- 错误:constexpr 变量'struct2Var'必须由常量表达式初始化
- 关于在需要常量表达式的上下文中使用的glvalue常量表达式的问题
- 生成 constexpr 字符串表,不能产生常量表达式
- 整体模板参数。错误:在常量表达式中使用'this'
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 编译器错误:函数调用在常量表达式中必须有一个常量值
- 错误:'new'不能出现在常量表达式中
- 我可以写出小于 -0.5 两个 ulps 的常量表达式双精度吗?
- 编译器在传递 const 变量时返回错误:模板参数不是常量表达式
- 为什么我不能在非常量表达式上使用此模板阶乘函数?
- C++ 使用变量而不是常量表达式初始化数组
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"