Tôi đang cố gắng để tìm hiểu thêm về tài liệu tham khảo rvalue nhưng tôi đã bị mắc kẹt trên ví dụ này đơn giản nhất:rvalue hello world thiếu constructor
#include <iostream>
using namespace std;
struct C {
C() { cout << "C()\n"; }
~C() { cout << "~C()\n"; }
C(const C&) { cout << "C(const C&)\n"; }
C& operator=(const C&) { cout << "operator=(const C&)\n"; return *this; }
C(C&&) { cout << "C(C&&)\n"; }
C& operator=(C&&) { cout << "operator=(C&&)\n"; return *this; }
};
C foo() { C c; return c; }
int main()
{
const C c = foo();
return 0;
}
tôi đã biên soạn nó với Clang 3.2 và -std=c++11 -fno-elide-constructors
(để tránh (N) RVO) nhưng kết quả gây ngạc nhiên cho tôi:
C()
~C() // huh?
C(C&&)
~C()
~C()
Tôi mong đợi chính xác là ngoại trừ ~C()
đầu tiên. Nó đến từ đâu và tôi đang mất tích vì có 2 công trình xây dựng và 3 lần phá hủy? Trình xây dựng & & có được gọi là tham chiếu đối tượng bị hủy không ??
Bước qua nó trong một trình gỡ lỗi và nhìn thấy nơi các cuộc gọi đến từ đó. Bạn nói đúng rằng số lượng các cuộc gọi hàm tạo và số lượng các cuộc gọi destructor sẽ giống nhau. –
Tôi nhận được http://liveworkspace.org/code/IlzNk$0 đó là những gì được mong đợi –
@SethCarnegie: nhưng bạn đã chọn GCC 4.7.2 phải không? Tôi đã cố gắng chọn clang 3.2 và tôi nhận được kết quả được hiển thị bởi OP –