std :: addressof как константное выражение в C ++ 17

Спецификация std::addressof был изменен для C ++ 17: теперь ему разрешено быть константным выражением. Тем не мение, cppreference Говорит, что:

Выражение std::addressof(E) является постоянным подвыражением, если E является
константа lvalue.

  • Что такое постоянное подвыражение?
  • Какой пример где std::addressof(E) будет постоянным выражением?
  • Какой пример где std::addressof(E) НЕ будет постоянным выражением?

10

Решение

Это объясняется Вот.

Введите следующее новое определение в существующий список в 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

}
11

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]