【问题标题】:error: invalid initialization of reference of type 'int&' from expression of type 'const int'错误:从“const int”类型的表达式中对“int&”类型的引用进行无效初始化
【发布时间】:2012-07-07 00:17:38
【问题描述】:

这是一个与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&amp;' from expression of type 'const int'

那是关于什么的?我传递了一个int。它不应该自动变成const int&amp;吗?为什么编译器会抱怨?

【问题讨论】:

  • 提示:T&amp; object; -- 另外,const T&amp; obj = nullptr 没有任何意义,您不能初始化对 nullptr 的引用。
  • 这是什么提示?这正是object 的声明方式。谢谢你,我会改变的。
  • 这是一个提示,因为您无法从 const 引用初始化非 const 引用 -- const-correctness 101。

标签: c++ compiler-errors


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,你的回答也不错,不过先到先得,不好意思=/
    • 没关系,我是来帮忙的,不是为了荣誉。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2022-01-08
    相关资源
    最近更新 更多