2015-12-15 18 views
9

Vấn đề là trình biên dịch khác nhau tạo ra đầu ra khác nhau (clang/gcc) và do đó làm cho tôi nghĩ rằng việc sử dụng này là hành vi không xác định. Tuy nhiên, mục tiêu của tôi là để suy ra const khi gán tham chiếu.Deducing const từ nhà điều hành T &()

Output với:
kêu vang-3.6 ->not const
gcc-4.8.4 ->const

#include <iostream> 
#include <type_traits> 

struct AnyReference { 

    template <typename RT> AnyReference(RT &a_var) : _ptr(&a_var) {} 

    template <typename T> operator T &() const 
    { 
     if (std::is_const<T>::value) { 
      std::cout << "const\n"; 
     } 
     else { 
      std::cout << "not const\n"; 
     } 
     return *reinterpret_cast<T *>(_ptr); 
    } 
    void *_ptr; 
}; 

int main() 
{ 
    int i(5); 
    AnyReference a(i); 
    const int &c = a; 
} 
+0

tôi cho phép bạn đọc bài đăng sau đây: http://stackoverflow.com/questions/32515183/const-auto-stdinitializer-list-difference-between-clang-and-gcc –

+3

Bạn đã cân nhắc cung cấp cả hai 'opera tor T & 'và' toán tử const T & '? –

+0

@Ben Voigt Không, tôi không có, nhưng đó là giải pháp tuyệt vời! Nó hoạt động như mong đợi. –

Trả lời

2

Một khả năng dựa trên ý tưởng của Ben Voight

struct AnyReference { 

    template <typename RT> AnyReference(RT &a_var) : _ptr(&a_var) {} 

    template <typename T> operator T &() const { return operatorTand<T>(); } 

    template <typename T> operator const T &() const 
    { 
     return operatorTand<const T>(); 
    } 

    private: 
    template <typename T> T &operatorTand() const 
    { 
     if (std::is_const<T>::value) { 
      std::cout << "const\n"; 
     } 
     else { 
      std::cout << "not const\n"; 
     } 
     return *reinterpret_cast<T *>(_ptr); 
    } 

    void *_ptr; 
};