2015-02-02 50 views
5

Tôi có một lớp mẫu như thế này:Lỗi khi sử dụng r và giá trị l nhà xây dựng trong một lớp mẫu

template <typename T> 
class MyClass 
{ 
public: 
    MyClass(const T & val); // First 
    MyClass(T&& val);  // Second 
}; 

Về cơ bản tôi muốn MyClass được constructible từ một T cho dù đó là một rvalue hoặc một giá trị trái. Bây giờ khi tôi có một cái gì đó như

const A& foo = ...; 
MyClass<const A&> x(foo); 

Tôi nhận được lỗi định nghĩa lại cho MyClass(const A & val).

Tôi giả định điều này là do T & & là tham chiếu chung và do quy tắc thu gọn tham chiếu, hàm tạo thứ hai cũng được chuyển đổi thành chữ ký giống như chữ đầu tiên.

Thứ nhất là sự hiểu biết của tôi về kịch bản lỗi chính xác? thứ hai làm thế nào tôi có thể nhận được xung quanh vấn đề này (Tôi muốn có thể sử dụng tối ưu hóa di chuyển ngữ nghĩa cung cấp khi xây dựng MyClass)?

Trả lời

6

Tôi đoán đây là vì T & & là một tham chiếu phổ thông ...

không đúng. T&& không phải là tham chiếu (chuyển tiếp) chung trong trường hợp này. T&& chính xác là tham chiếu rvalue cho số T. Các tham chiếu phổ quát/chuyển tiếp phải được suy luận.

... và do quy tắc thu gọn tham chiếu, hàm tạo thứ hai cũng được chuyển đổi thành chữ ký giống như chữ đầu tiên.

Điều này là chính xác. Hai nhà thầu của chúng tôi mất:

T const& ==> A const& const& ==> A const& 
T&&  ==> A const& &&  ==> A const& 

do đó lỗi định nghĩa lại.

Tùy thuộc vào những gì bạn muốn làm, một giải pháp đơn giản có thể là để chỉ std::decayT:

template <typename T> 
class MyClass 
{ 
    using DecT = typename std::decay<T>::type; 

public: 
    MyClass(const DecT&); 
    MyClass(DecT&&); 
}; 

Ví dụ của bạn, mà vẫn sẽ tạo ra một lớp học với hai cấu trúc: một dùng const A& và khác lấy A&&.

+0

ok, bây giờ làm cách nào để khắc phục sự cố? mà không hy sinh trên hàm tạo có giá trị r? – Arun

+0

@Arun Đã viết một cách tiếp cận. Khác sẽ là chỉ ... không cho phép 'MyClass' lấy các kiểu tham chiếu với một khẳng định tĩnh và thực thi ở một nơi khác. – Barry

+0

'Một const & const &' là 'Một const &'. Ditto cho 'A const & &&'. –

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