2010-11-10 55 views
13

Tôi đã nghe một chút về vấn đề tham chiếu đến tham chiếu và độ phân giải this. Tôi không giỏi lắm với thuật ngữ C++ Committee, nhưng tôi hiểu chú thích "Moved to DR" trong liên kết có nghĩa rằng đây là giải thích hiện tại mà các trình biên dịch tuân thủ tiêu chuẩn phải tuân thủ.C++ - instantiation mẫu với loại tài liệu tham khảo

Tôi có mẫu này mã mà tôi không thể hiểu:

template <typename T> 
struct C { 
    void f(T&) { } 
    void f(const T&) { } 
}; 

int main() { 
    C<int> x;  // OK 
    C<int&> y;  // compile error: f cannot be overloaded 
    C<const int&> z; // compile error: f cannot be overloaded 
} 

Tôi hiểu những lỗi trong C<const int&> trường hợp: sử dụng điều khiển từ DR # 106 chúng tôi nhận được hai phương pháp với chữ ký cùng f (const int &). Những gì tôi không nhận được là trường hợp C<int&>: không nên tạo chính xác mã giống như C<int> (ít nhất theo độ phân giải của Stroustrup)?

+0

Bạn đang sử dụng trình biên dịch nào? –

+0

vs2010 tạo ra cùng một lỗi (trong khi vs2008 báo cáo một lỗi bất hợp pháp ref-to-ref) –

+0

điều này có một cái gì đó để làm với thực tế là động/tĩnh đúc không được phép với tham chiếu đến các loại."'doubl & d = dynamic_cast (someintvariable)'" dẫn đến 'static_cast': không thể chuyển đổi từ 'int' thành 'double &' trong MSVC –

Trả lời

3

DR chỉ có nghĩa là "Báo cáo lỗi" và theo hiểu biết của tôi, độ phân giải đã mô tả chưa đạt được tiêu chuẩn. Vì lý do này, tôi tin rằng việc triển khai C++ 03 tuân thủ nghiêm ngặt không nên biên dịch mã này vì nó đang tạo thành tham chiếu đến tham chiếu.

[Chỉnh sửa] Chỉ tìm thấy nice answer về sự cố này.

+0

Một nội dung thú vị khác: http://groups.google.com/group/comp.std.c++/browse_thread/thread/ac9ba419a0d95b2d – icecrime

+0

Đây là một nội dung thú vị! –

+0

Cảm ơn, hành vi của trình biên dịch độc đáo này giải thích trong mọi trường hợp được đề cập bởi tôi và Steve Townsend. – jhh

1

Điều thú vị là, khi tôi biên dịch mã của bạn (Visual C++ 10 Express) tôi nhận lỗi, nhưng cũng có khi tôi cố gắng trường hợp này đơn giản hơn:

int main(int argc, char* argv[]) 
{ 
    C<int> x;  // OK 
    C<const int> x1; // error C2535: 'void C<T>::f(T &)' : member function 
        // already defined or declared 
    return 0; 
} 

Có vẻ như các ref ref-to-sụp đổ được định nghĩa trong DR bạn đã đề cập có nghĩa là ref const trở thành một đơn giản không const ref trong mẫu. Vấn đề của tôi với điều này là tôi không hiểu tại sao thứ hai f không chỉ bị bỏ qua.

Nếu tôi thay đổi C sao cho f thứ hai là const -qualified, này ngay bây giờ biên dịch:

template <typename T> 
struct C { 
    void f(T&) { } 
    void f(const T& t) const {} 
}; 

Hàm ý có vẻ là rằng khi C được khởi tạo với const bất cứ điều gì (ref hay không), hai C::f quá tải chỉ đơn giản là giống hệt nhau và dẫn đến phát hiện trùng lặp thời gian biên dịch.

Có lẽ ai đó thông minh hơn tôi có thể giải mã chuỗi rõ ràng hơn ở đây.

EDIT: Trên phản xạ, nó không phải là đáng ngạc nhiên ở đây là T = const int& kết quả trong f quá tải bị hệt instantiated như

void f(const int&) {} 

Đó là những gì các trình biên dịch là nói cho tôi:

#include "stdafx.h" 

template <typename T> 
struct C { 
    void f(T&) { } 
    void f(const T&) { } 
}; 

int main() { 
    C<const int&> z; // compile error: f cannot be overloaded 
    return 0; 
} 

cho lỗi này:

1>test.cpp(6): error C2535: 'void C<T>::f(T)' : member function already 
    defined or declared 
1>   with 
1>   [ 
1>    T=const int & 
1>   ] 
1>   test.cpp(5) : see declaration of 'C<T>::f' 
1>   with 
1>   [ 
1>    T=const int & 
1>   ] 
1>   test.cpp(10) : see reference to class template instantiation 
       'C<T>' being compiled 
1>   with 
1>   [ 
1>    T=const int & 
1>   ] 

Tôi thậm chí không đã thuyết phục điều này có liên quan đến DR.

+0

Bây giờ tôi nghĩ rằng nó là lạ ... Ví dụ của bạn trong thực tế không có gì để làm với ref-to-ref; trong khi C trong câu hỏi không có gì để làm với const ... –

+0

@ lz_prgmr - Tôi thậm chí không chắc chắn là ví dụ của tôi là có liên quan ngoài các lỗi trình biên dịch giống hệt nhau nó tạo ra. Tôi hy vọng sẽ di chuyển cuộc thảo luận cùng một số, là tất cả. Tôi đoán nếu một 'T' cụ thể thực sự giải quyết cho cả hai quá tải' f', thì lỗi trình biên dịch được mong đợi - nó sẽ không bỏ qua một trận đấu tốt như nhau. Tại sao mỗi người được coi là 'bình đẳng tốt', là câu hỏi tôi không thể trả lời. –

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