c – 错误:类型’int int’的类型’int int’的引用的无效初始化

关于以下模板功能,这是一个关于 @L_301_0@代码的无关问题.
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);

我得到一个编译器警告:错误:类型’int&’的引用的无效初始化从“const int”类型的表达式.

这是什么?我传递一个int,不应该自动变成一个const int&为了我?为什么编译器抱怨?

解决方法

obj是一个常量引用.对象是一个非常量引用.

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

如果您希望Object的实例能够修改传递给其构造函数的int,那么构造函数应该使用非const引用.如果没有,那么数据成员应该是一个const引用.

在任何情况下,如果您使用新的分配具有引用的对象作为数据成员,您正在为自己储存麻烦.这是您的问题,以确保在我超出范围之前删除对象(或者无论如何,确保对象在超出范围后不使用其成员对象.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...