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() constconst 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_typeis int& const- つまり、型全体がそれreference_typeconst適用されており、const参照が存在できないため、int&. const int&期待どおりに取得していません。

ご指摘のとおり、ここでの修正は次のとおりです。

typedef const value_type& const_reference_type;

ここでのヒントはtypedef、型名の単なる検索と置換と考えないことです。そのように動作しないためです。

于 2013-01-20T19:17:56.773 に答える
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

2 番目のケースの 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 に答える
4

あなたのtypedefでは、あなたが思っているように等しくconst reference_typeありません。const value_type &むしろvalue_type & constどちらが効果的かvalue_type &です。

const左側よりも右側に塗る方が好きな理由の 1 つです。あなたが書くなら

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 に答える