2012-06-13 28 views
7

Một hàm khởi tạo (như sau) có ghi đè lên hàm tạo bản sao ngầm không?Nhà xây dựng có khuôn mẫu có ghi đè lên hàm tạo bản sao ẩn trong C++ không?

template <class T> 
struct Foo 
{ 
    T data; 

    // ... 

    template <class U> 
    Foo(const Foo<U> &other) : data((T)doSomethingWith(other.data)) {} 

    // ... 
}; 

Nếu có, nó vẫn ghi đè nếu other được chuyển bởi giá trị thay vì tham chiếu không đổi?

Nếu có, có cách nào xung quanh điều này mà không xác định rõ ràng một hàm tạo bản sao không?

Trả lời

7

Không, đó không phải là hàm tạo bản sao. Mục 12,8 ([class.copy]) của tiêu chuẩn đòi hỏi rằng:

Một phi mẫu constructor cho lớp X là một constructor sao chép nếu tham số đầu tiên của nó là loại X&, const X&, volatile X& hoặc const volatile X&, và một trong hai không có khác các tham số hoặc tất cả các tham số khác có đối số mặc định.

Trình biên dịch sẽ vẫn ngầm tạo ra mặc định.

Bạn có thể làm cho điều đó rõ ràng (yêu cầu C++ 11) bởi

Foo(const Foo<T>&) = default; 
2

Liệu một constructor templated (như sau) ghi đè lên các nhà xây dựng bản sao tiềm ẩn?

No. Trình tạo bản sao vẫn được khai báo hoàn toàn và được chọn tùy theo mẫu.

Có cách nào xung quanh điều này mà không xác định rõ ràng một hàm tạo bản sao không?

Không. Nếu bạn không muốn hàm tạo bản sao ẩn, thì bạn sẽ phải tự định nghĩa một hàm.

2

Nhà xây dựng hoặc nhà điều hành gán templated trông giống như một [nhà xây dựng mặc định/nhà xây dựng bản sao/nhà xây dựng di chuyển/nhà điều hành chuyển nhượng bản sao/nhà điều hành chuyển nhượng bản sao] không phải là thực sự a [constructor mặc định/copy constructor/move constructor/copy toán tử gán toán tử di chuyển/gán) và sẽ không thay thế nó hoặc ngăn chặn nó được tạo ra ngầm.

+0

Ý tưởng là đúng, nhưng những gì bạn viết là sai. Bạn có nghĩa là "Một nhà xây dựng bản sao sẽ không ..."? Đó là sai. Bạn có nghĩa là "Một constructor sao chép templated sẽ không ..."? Không có những điều như vậy. –

+0

@BenVoigt Mặc dù tôi nghĩ rằng nó đã được rõ ràng trước đây, tôi đã cố gắng để làm cho nó chính xác hơn - mặc dù tbh Tôi nghĩ rằng đó là khó hiểu hơn bây giờ. – David

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