1. ホーム
  2. c++

[解決済み] error: 'const int' 型の式からの 'int&' 型の参照の無効な初期化

2022-02-07 09:09:43

質問

のコードについて、関係ない質問です。 この質問 以下のテンプレート関数について。

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& ということですか?なぜコンパイラは文句を言うのでしょうか?

解決方法を教えてください。

obj は const 参照です。 object は非恒久的な参照である。

const参照からconstでない参照を初期化することはできません。そうすると、そもそもconst参照を持つ意味がなくなってしまうからです。

のインスタンスを作成したい場合 Object を変更できるようにすることです。 int の場合、コンストラクタは非恒等式参照を受け取る必要があります。そうでない場合は、データメンバは const 参照であるべきです。

いずれにせよ、このような使い方はトラブルの元です。 new を使用して、データメンバとして参照を持つオブジェクトを割り当てます。それは あなたの を確実に削除することが問題です。 Object 前に i がスコープ外に出るようにする(あるいはとにかく Object は、そのメンバーである object の後に i がスコープ外になる。