2012-03-12 38 views
5

Hiện tại tôi đang viết luận văn và nó cũng giải thích lý thuyết đằng sau C++ 11, điều này thực sự tốt khi C++ là ngôn ngữ lập trình của tôi và tiêu chuẩn càng ít hoặc miễn phí (N3337) bản thân bạn bị mất.Xvalues ​​đối tượng tạm thời?

Tuy nhiên, tôi đã nhấn một bức tường trong khi cố gắng giải thích danh mục xvalue mới một cách chính xác và chi tiết. Đó là sự hiểu biết của tôi rằng một đối tượng tạm thời luôn luôn là một xvalue nhưng tôi không thể tìm thấy bất kỳ tham chiếu đến điều này trong tiêu chuẩn. Đó là sự hiểu biết của tôi rằng danh mục giá trị của một biểu thức của một cuộc gọi hàm đến một hàm có kiểu trả về không tham chiếu, là một xvalue. Tiêu chuẩn nói rằng "một xvalue là kết quả của một số loại biểu thức liên quan đến tham chiếu rvalue" mà là bugging tôi. Ví dụ:

TestClass { ... }; 
testClass createObject() { return testClass(); } 

void someFunction(TestClass& testClass) { ... } 
void someFunction(TestClass&& testClass) { ... } 

someFunction(createObject()); 

Hàm trên, như mong đợi, gọi hàm bị quá tải tham chiếu tham chiếu giá trị. Tuy nhiên createObject() không trả về một tham chiếu rvalue, nó trả về một đối tượng tạm thời của kiểu TestClass. Vấn đề của tôi bây giờ là tôi phải giải thích lý do đằng sau nó. Biểu thức "createObject()" được đánh giá là gì? Nếu nó thực sự là một xvalue bởi vì nó trả về một đối tượng tạm thời, lý do đằng sau nó là rõ ràng và tham chiếu rvalue được ưa chuộng trong quá trình phân giải quá tải. Nếu không, giải thích cho hành vi này liên quan đến tiêu chuẩn là gì? Có một số logic chuyển đổi tiềm ẩn được định nghĩa ở đâu đó mà tôi chưa tìm thấy?

Tôi thực sự đánh giá cao nếu có ai đó có thể giúp tôi về điều này bởi vì ngay cả sau nhiều ngày đào và đọc, tôi vẫn chưa đưa ra một lời giải thích âm thanh. Cảm ơn rất nhiều trước.

+0

[câu hỏi liên quan] (http://stackoverflow.com/questions/6609968/) – fredoverflow

Trả lời

10

Đối tượng không bao giờ là giá trị {l | r | x}. các loại giá trị mô tả các biểu thức .

Xvalue là phạm trù giá trị của biểu thức chức năng gọi nơi các loại chức năng trở lại là một tài liệu tham khảo rvalue phản đối (ví dụ std::move), và nó cũng là loại giá trị của biểu thức cast nơi các diễn viên là một rvalue tham chiếu đến đối tượng (ví dụ: ruột của std::move).

Biểu thức gọi hàm createObject() trong ví dụ của bạn là biểu thức prvalue vì đó là lệnh gọi hàm đến hàm có loại trả về không tham chiếu.

+0

Tôi biết các danh mục chỉ áp dụng cho các biểu thức. :) Xin lỗi, tôi đã không rõ ràng trong bài viết của tôi và sẽ sửa nó trong giây lát. Bây giờ tôi có cảm thấy ngu ngốc không - thật ngu ngốc. Tôi không biết những gì tôi đã suy nghĩ mong đợi sự biểu hiện của một cuộc gọi chức năng với một loại không trở lại tham khảo là một xvalue. Cảm ơn rất nhiều. Và tôi tốt hơn nên trốn đi và trốn ngay bây giờ ... :( – khaos

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