2016-12-16 17 views
7

Giả sử tôi có như sau (không hợp lệ) mã:C++ Constructor bởi Value

struct A { 
    A(A) {}; 
}; 

MSVC mang lại cho tôi:

error C2652: 'A' : illegal copy constructor: first parameter must not be a 'A' 

Tại sao trình biên dịch phát hiện này như constructor sao chép, và không phải là một nhà xây dựng thường xuyên ?

Chương 12.8.2 của ++ Chuẩn C nói:

A non-template constructor for class X is a copy constructor if its first parameter is of type X& , const X& , volatile X& or const volatile X&

Tôi mong rằng trình biên dịch phát hiện các phương pháp trên như constructor thường xuyên, giống như

struct A { 
    A(B) {}; 
}; 

trong khi B là một lớp khác.

Hành vi này được xác định ở đâu?

+0

trên GCC 4.9.2, lỗi: constructor không hợp lệ; bạn có thể có nghĩa là 'A (const A &)' –

+5

Có lẽ vì đây là một lỗi đủ phổ biến khi mọi người cố gắng tạo một hàm tạo bản sao của riêng mình mà MSVS cố gắng trở nên tốt đẹp và cho họ biết. – NathanOliver

+0

@NathanOliver: Tôi thích điều đó. – Bathsheba

Trả lời

5

N4140 [class.copy]/6

A declaration of a constructor for a class X is ill-formed if its first parameter is of type (optionally cv-qualified) X and either there are no other parameters or else all other parameters have default arguments.

+0

Cảm ơn, đây là điều tôi đang tìm kiếm. Tôi tin rằng thông báo lỗi chỉ là gây hiểu lầm sau đó – tobspr

+1

Khước từ tôi bằng những gì, 9 giây? : P – Columbo

+1

Điều này nêu rõ những gì chúng ta đều biết, hàm tạo là một lỗi. Câu hỏi đặt ra là tại sao MSVS nghĩ rằng nó là một nhà xây dựng bản sao. – NathanOliver