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

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

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

  • что такое постоянные выражения?
  • что такое пример, где std::addressof(E) будет постоянным выражением?
  • что такое пример, где std::addressof(E) не будет постоянным выражением?

1 ответов


Это объясняется здесь.

ввести следующее новое определение в существующий список в 17.3 [определения]: [Примечание редакционного характера: если РГПВ 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 делает (при условии, что & вызывает встроенный оператор address-of).

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

}