#include <iostream>
template <typename T>
struct ref_exp{
typedef T value_type;
typedef value_type& reference_type;
typedef const reference_type const_reference_type;
ref_exp(value_type data): _data(data){}
const_reference_type data() const {return _data;}
private:
value_type _data;
};
int main(){
ref_exp<int> exp1(2);
std::cout << exp1.data() << std::endl;
return 0;
}
以上代码无法编译
ref.cpp: In member function ‘T& ref_exp<T>::data() const [with T = int]’:
ref.cpp:17: instantiated from here
ref.cpp:10: error: invalid initialization of reference of type ‘int&’ from expression of type ‘const int’
但如果我将const_reference_type data() const
替换为const value_type& data() const
则可行。如果我替换typedef const reference_type const_reference_type
与typedef const value_type& const_reference_type
编译
答案 0 :(得分:6)
您的const_reference_type
typedef没有按照您的想法行事:
typedef const reference_type const_reference_type;
const_reference_type
是int& const
- 即整个类型reference_type
已应用const
- 并且const
引用不可存在,因此您获得int&
。你没有得到预期的const int&
。
正如您所指出的,此处的修复方法是:
typedef const value_type& const_reference_type;
这里的提示是不要将typedef
视为类型名称的查找和替换,因为它不会那样。
答案 1 :(得分:4)
const reference_type
表示引用是const,而不是引用的对象是const。
typedef int &int_ref; // int_ref is a reference to a non-const int
typedef const int_ref int_ref_const;
// int_ref_const is a const reference to a non-const int
第二种情况下的const限定符基本上是无操作,因为引用是隐式的const。
考虑使用指针的类似案例:
typedef int *int_ptr; // int_ptr is a pointer to a non-const int
typedef const int_ptr int_ptr_const;
// int_ptr_const is a const pointer to a non-const int.
答案 2 :(得分:4)
在您的typedef中,const reference_type
不等于const value_type &
,您似乎在想。相当value_type & const
,它实际上是value_type &
。
这是我更喜欢在右侧而不是在左侧应用const
的一个原因。如果你写
reference_type const
然后很明显它实际这个:
value_type & const //actually
而不是而不是:
value_type const & //intended
现在很清楚,不是吗?
请注意value_type const &
和const value_type &
相同的类型。
无论如何,要解决问题,您需要将typedef定义为:
typedef value_type const & const_reference_type;
我更喜欢在右侧申请const
。