2012-10-31 37 views
11

Xét đoạn mã sau:Tại sao mã thông báo được bao quanh bởi dấu ngoặc đơn chứ không phải biểu thức giá trị r?

#include <iostream> 

struct Foo 
{ 
    Foo() : bar(0) {} 

    int bar; 
}; 


int main() 
{ 
    Foo foo; 

    ++(foo.bar); 

    std::cout<< foo.bar << std::endl; 

    system("pause"); 
    return 0; 
}; 

Tại sao foo.bar đánh giá đến 1?

Không dấu ngoặc đơn trong (foo.bar) tạo biểu thức chưa đặt tên (r-giá trị) sau đó được tăng lên?

+0

Không, bạn có nhầm lẫn điều này với một số ngôn ngữ khác trong đó 'f (x)' và 'f ((x))' khác nhau không? –

+1

@BoPersson Nhưng có một số ngữ cảnh mà nó tạo nên sự khác biệt. Ví dụ 'decltype (x)' và 'decltype ((x))' có thể khác nhau. – juanchopanza

+0

@juanchopanza: damned ... đó là khó khăn! –

Trả lời

9

Bởi vì tiêu chuẩn một cách rõ ràng rằng trong 3.4.2 para 6:

Một biểu thức trong ngoặc đơn là một biểu thức chính mà loại và giá trị là giống hệt với các biểu hiện kèm theo. Sự hiện diện của dấu ngoặc đơn không ảnh hưởng đến việc biểu thức là một giá trị.

điểm nhấn của tôi.

+2

Tôi đã nhầm lẫn, bởi vì: 'struct Widget {} w;' -> 'decltype (w)' và 'decltype ((w))' không giống nhau. Xem thêm [link] (https://skydrive.live.com/view.aspx?resid=F1B8FF18A2AEC5C5!1062), trang 33. – Martin85

+0

@ user1787909: 'decltype' là đặc biệt. –

1

Không, dấu ngoặc đơn không có ý nghĩa gì ngoài việc thay đổi thứ tự hoạt động.

Để tạo giá trị bạn cần sử dụng chức năng đặc biệt std::move(x).

+0

điều này là không đúng. họ có thể ngừng adl xảy ra. –

+0

@Johannes, Adl là gì? –

+0

bạn có thể muốn tạo câu hỏi ngăn xếp mới trên đó. –

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