C++17的规范std::addressof
已更改:现在允许它是常量表达式。但是,cppreference说:
该表达式
std::addressof(E)
是一个常量子表达式,ifE
是一个左值常量子表达式。
- 什么是常量子表达式?
std::addressof(E)
什么是常量表达式的示例?- 什么是
std::addressof(E)
不是常量表达式的示例?
这是解释here。
在 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
}