错误:'int&'类型引用的初始化无效来自'const int'类型的表达式

时间:2012-07-07 00:17:38

标签: c++ compiler-errors

这是关于this question中关于以下模板函数的代码的无关问题。

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&吗?为什么编译器会抱怨?

2 个答案:

答案 0 :(得分:13)

obj是一个const引用。 object是非const引用。

你不能从const引用初始化非const引用,因为这样做会破坏首先使用const引用的目的。

如果您希望Object的实例能够修改传递给其构造函数的int,那么构造函数应该采用非const引用。如果不这样做,那么数据成员应该是const引用。

在任何情况下,如果使用new来分配具有引用作为数据成员的对象,则会为自己存储麻烦。这是你的问题,以确保在Object超出范围之前删除i(或者无论如何,确保Object不使用其成员{ object超出范围后{1}}。

答案 1 :(得分:8)

您尝试将const引用分配给非const引用。 这意味着您的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

在这种情况下,您无法修改对象