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

Mic*_*rst 12 c++ compiler-errors

关于以下模板函数,这是关于此问题中的代码的无关问题.

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

    Object(const T& obj) : object(obj) {}
};
Run Code Online (Sandbox Code Playgroud)

这是调用构造函数的代码:

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

这段代码编译得很好,但是只要我添加一行就main可以调用它:

Array array;
int i = 3;
array.add_element(i);
Run Code Online (Sandbox Code Playgroud)

我收到编译器警告:error: invalid initialization of reference of type 'int&' from expression of type 'const int'.

那是什么?我通过了int.它不应该自动转为const int&我吗?为什么编译器会抱怨?

Ste*_*sop 13

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

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

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

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


ilm*_*ale 8

您尝试将const引用分配给非const引用.这意味着您的Object类可以修改对象的内容.

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

intObj.object = 3; // you have indirectly modified the value of myConstNumber
Run Code Online (Sandbox Code Playgroud)

C++不允许你这样做.您可以制作对象的副本或将const添加到属性中.

template <class T>
class Object : public Container {
public:
    T object; // valid
Run Code Online (Sandbox Code Playgroud)

要么

template <class T>
class Object : public Container {
public:
    const T& object; // valid
Run Code Online (Sandbox Code Playgroud)

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

  • 没关系,我来这里是为了帮助,而不是为了荣誉.:) (6认同)