2016-05-11 14 views
7

Theo C++ Primer, toán tử mũi tên C++ mang lại giá trị lvalue. Ngoài ra decltype của một biểu thức mang lại một giá trị sẽ dẫn đến một loại tham chiếu. Vì vậy, tại sao decltype sau đây không không dẫn đến loại tham chiếu.C++ kiểu mũi tên sản lượng lvalue

struct MyStruct { 
    string name 
}; 
MyStruct s; 
s.name = "aname"; 
MyStruct* p = &s; 
decltype (p -> name) str = s.name; //type of str will be string and not &string although p -> name yields an lvalue 
+3

Xem http://en.cppreference.com/w/cpp/language/decltype. – Holt

Trả lời

5

Từ decltype (đó là từ § 7.1.6.2/4 [dcl.type.simple]):

Nếu đối số là một id thể hiện unparenthesized hoặc một thành viên lớp unparenthesized truy cập, sau đó decltype sản lượng các loại đối tượng đã nêu bởi cựu này pression.

p->name rơi vào trường hợp trên, vì vậy các loại decltype(p->name) là loại p->name đó là std::string không std::string&.

Mặt khác, decltype((p->name))std::string&(p->name) là biểu thức giá trị.

9

Từ cppreference

Nếu đối số là một id thể hiện unparenthesized hoặc một unparenthesized truy cập thành viên lớp, sau đó decltype sản lượng các loại đối tượng đã nêu bởi biểu thức này. Nếu không có thực thể như vậy, hoặc nếu đối số đặt tên cho một tập hợp các hàm bị quá tải, chương trình sẽ bị hỏng.

Đây là trường hợp trong ví dụ của bạn, vì vậy nó sẽ trả về kiểu cơ bản của thành viên, là std::string.

Nếu bạn muốn, bạn có thể thêm dấu ngoặc đơn để decltype kết quả trong một tài liệu tham khảo:

//'str' is a std::string& 
decltype((p->name)) str = s.name; 
Các vấn đề liên quan