2015-10-13 12 views
8

Trường hợp ngoại lệ sử dụng loại đối tượng thống kê để sao chép-khởi tạo đối tượng được ném. Ví dụ:Tại sao phải ném các đối tượng được sao chép-khởi tạo?

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
}; 

int main() 
{ 
    throw foo(); 
} 

Clang++ --std=c++14 phàn nàn rằng không thể sử dụng hàm tạo bản sao rõ ràng. Tại sao nó không thể di chuyển được khởi tạo thay vào đó?

+0

Tôi không thể xóa nó nữa vì nó có câu trả lời nhưng tôi đang bỏ phiếu để đóng với tư cách chủ đề vì "lỗi typographic đơn giản". Vấn đề của tôi không phải là tầm thường như thế này, nhưng tôi rõ ràng chỉ quên tạo một hàm khởi tạo. – zneak

+0

Nhờ câu hỏi của bạn, tôi đã học được điều gì đó. Xin đừng bỏ phiếu để đóng nó, và không có nghĩa là không xóa nó !! –

Trả lời

9

Nó không thể di chuyển được xây dựng vì loại không có hàm khởi tạo. Một nhà xây dựng bản sao đã xóa sẽ ngăn chặn hàm tạo di chuyển ngầm.

4

Vì thiếu foo(foo&&);. Bởi delete ing constructor sao chép bạn đã đẩy mạnh constructor di chuyển là tốt.

+0

Hàm khởi tạo di chuyển không bị xóa, chỉ vắng mặt. –

+0

@JonathanWakely những gì 'không bị xóa, chỉ thiếu'? Xóa constructor sao chép ngụ ý xóa di chuyển constructor cũng như – SergeyA

+0

@JonathanWakely: Hai giác quan hơi khác nhau của "deleted". Tôi nghĩ rõ ràng hơn những gì người ta có thể và không thể làm được. Chẳng hạn như định nghĩa một hàm tạo di chuyển. –

6

Sửa đổi mã như sau:

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
    foo(foo&&) = default; 
}; 

int main() 
{ 
    throw foo(); 
} 

đọc this, phần "Mặc nhiên-tuyên bố động thái xây dựng".

3

Các phân nhịp áp dụng từ tiêu chuẩn (§ [class.copy]/9) trông gần như thế này (tốt, chính xác như thế này, tính đến N4296):

Nếu định nghĩa của một lớp X không không tuyên bố một cách rõ ràng một constructor di chuyển, người ta sẽ được khai báo ngầm như mặc định khi và chỉ khi:

  • X không có một người dùng công bố bản sao ctor,

[...]

Điều này áp dụng vì việc xác định ctor bản sao bị xóa vẫn có nghĩa là bạn đã khai báo ctor sao chép.

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