2016-04-12 67 views
10

Đặc điểm kỹ thuật của std::addressof đã được thay đổi cho C++ 17: nó bây giờ được phép là một biểu thức liên tục. Tuy nhiên, cppreference nói rằng:std :: addressof như là một biểu thức liên tục trong C++ 17

Khái niệm std::addressof(E) là một subexpression không đổi, nếu E là một subexpression liên tục giá trị trái.

  • Biểu thức con liên tục là gì?
  • Ví dụ ở đâu std::addressof(E) sẽ là một biểu thức liên tục?
  • Ví dụ nơi std::addressof(E) sẽ KHÔNG là biểu thức liên tục?

Trả lời

11

Điều này được giải thích here.

Giới thiệu định nghĩa mới sau vào danh sách hiện có trong 17,3 [định nghĩa]: [Soạn thảo lưu ý: Nếu LWG 2234 được chấp nhận trước khi vấn đề này, các từ ngữ được chấp nhận cho định nghĩa mới nên được sử dụng thay - cuối soạn thảo lưu ý]

**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]). 

Vì vậy, "subexpression liên tục" đại khái có nghĩa là "bạn có thể sử dụng nó trong một biểu thức hằng".

Ví dụ nơi std :: addressof (E) sẽ là biểu thức không đổi?

Tôi tin rằng nó nhằm cung cấp biểu thức không đổi bất cứ khi nào &E thực hiện (giả sử rằng & gọi trình xử lý địa chỉ được tích hợp sẵn).

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 

một ví dụ nơi std :: AddressOf (E) sẽ KHÔNG TRÚNG PHẢI một biểu thức hằng số là gì?

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 

} 
+0

vì vậy 'x' là biểu thức không đổi, nhưng không phải là biểu thức con liên tục, trong ví dụ thứ hai? Rõ ràng là bùn –

+0

@ M.M Trên thực tế 'x' cũng là một biểu thức liên tục trong ví dụ thứ hai ... Tôi có lẽ nên chọn một ví dụ tốt hơn. – Brian

+0

Tôi đã nói không phải biểu thức * phụ * liên tục –

Các vấn đề liên quan