14

これは、次のテンプレート関数に関する、この質問のコードに関する無関係な質問です。

template <class T>
class Object : public Container {
public:
    T& object;

    Object(const T& obj) : object(obj) {}
};

これは、コンストラクターを呼び出すコードです。

template <class T>
void Array::add_element(const T& element)
{
    vec.push_back(new Object<T>(element));
}

mainこのコードは正常にコンパイルされますが、それを呼び出す行を追加するとすぐに:

Array array;
int i = 3;
array.add_element(i);

コンパイラの警告が表示されます: error: invalid initialization of reference of type 'int&' from expression of type 'const int'.

それは何についてですか?を渡しましintた。自動的に に変換されるべきではありconst int&ませんか? コンパイラが文句を言うのはなぜですか?

4

2 に答える 2

18

objconstリファレンスです。object非定数参照です。

const参照から非const参照を初期化することはできません。そうすると、そもそもconst参照を持つという目的が無効になるためです。

のインスタンスがそのコンストラクターに渡されるObjectを変更できるようにする場合int、コンストラクターは非const参照を取得する必要があります。そうでない場合は、データメンバーをconst参照にする必要があります。

いずれにせよ、newデータメンバーとして参照を持つオブジェクトを割り当てるために使用すると、問題が発生しやすくなります。スコープ外になる前に削除することを確認するのはあなたの問題です(またはとにかく、スコープ外になった後にそのメンバーを使用しないようにしてください。ObjectiObjectobjecti

于 2012-07-07T00:26:35.217 に答える
11

const参照をnonconst参照に割り当てようとしています。これは、Objectクラスがオブジェクトのコンテンツを変更できることを意味します。

const int myConstNumber = 4;
Object<int> intObj(myConstNumber);

intObj.object = 3; // you have indirectly modified the value of myConstNumber

C++ではそれができません。オブジェクトのコピーを作成するか、属性にconstを追加できます。

template <class T>
class Object : public Container {
public:
    T object; // valid

また

template <class T>
class Object : public Container {
public:
    const T& object; // valid

この場合、オブジェクトを変更することはできません

于 2012-07-07T00:28:07.423 に答える