这是关于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&
吗?为什么编译器会抱怨?
答案 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
在这种情况下,您无法修改对象