std::addressof как константное выражение в C++17
Спецификация std::addressof
был изменен для C++17: теперь ему разрешено быть константным выражением. Тем не менее, cppreference говорит, что:
Выражение
std::addressof(E)
является постоянным подвыражением, еслиE
является подвыражением константы lvalue.
- Что такое постоянное подвыражение?
- Какой пример где
std::addressof(E)
будет постоянным выражением? - Какой пример где
std::addressof(E)
НЕ будет постоянным выражением?
1 ответ
Это объясняется здесь.
Внести следующее новое определение в существующий список в 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
}