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

obj是一个常量引用。object是一个非常量引用。

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

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

在任何情况下,如果您使用new分配具有引用作为数据成员的对象,您将给自己带来麻烦。确保您删除before超出范围是您的问题(或者无论如何,确保在超出范围后不使用其成员。ObjectiObjectobjecti

于 2012-07-07T00:26:35.217 回答
11

您正在尝试将 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

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

于 2012-07-07T00:28:07.423 回答