4
#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编译

4

3 回答 3

6

你的const_reference_typetypedef 没有按照你的想法做:

typedef const reference_type const_reference_type;

const_reference_typeint& const——也就是说,整个类型reference_typeconst应用于它——并且const引用不能存在,所以你得到int&. 您没有得到const int&预期的结果。

正如您所指出的,这里的解决方法是:

typedef const value_type& const_reference_type;

这里的提示是不要认为typedef只是类型名称的查找和替换,因为它的行为方式并非如此。

于 2013-01-20T19:17:56.773 回答
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在右侧申请。

于 2013-01-20T19:23:46.863 回答
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.
于 2013-01-20T19:17:42.133 回答