【问题标题】:Error binding to reference discard qualfier错误绑定到引用丢弃限定符
【发布时间】:2017-12-11 11:24:50
【问题描述】:

我正在编写一个朋友函数来扩展我创建的类 Vector。

    Vector myFunc (const Vector& from)
        {
        Vector res = from;
        //stuff
        return res;
        }

它给了我错误:将“const Vector”绑定到“Vector&”类型的引用会丢弃限定符。

我不明白为什么这是无效的,因为我只是在修改通过重载 operator=(const Vector&) 函数创建的 const 对象的副本

但是,如果我修改它以创建矢量,然后复制

    Vector myFunc (const Vector& from)
        {
        Vector res;
        res = from;
        //stuff
        return res;
        }

它编译没有错误。为什么?

【问题讨论】:

  • 如果不发布Vector 的定义,就没什么好讨论的了,因为这将是产生此错误的重载的来源。
  • 您应该发布更多代码。特别是您的复制构造函数。

标签: c++ c++11


【解决方案1】:

Vector res = from; 行不调用operator=(const Vector&),它是一个copy-initialization 语法调用复制构造函数。您的复制构造函数很可能被定义为 Vector(Vector&) 而不是 Vector(Vector const &)

【讨论】:

  • 如果没有const 引用就会出错;复制的东西不应该有任何修改它的机会。
【解决方案2】:

正如 VTT 所说,我确实调用了复制构造函数,出于问题之外的原因,我将其定义为 Vector (Vector&)。仍然不确定为什么编译器(gcc)不使用默认构造函数然后使用复制构造函数,这将是有效的,但我想这是一个简单的解决方案

【讨论】:

  • 几乎只要你定义了一个构造函数,所有的默认构造函数都会被禁用。在过去的糟糕日子里,您必须自己编写它们。在 c++11 中,您可以使用“= default”语法来恢复默认行为。但是,很难理解为什么您既想要修改副本又想要非修改副本?这会导致任何用户感到困惑。
猜你喜欢
  • 2022-01-07
  • 2018-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
相关资源
最近更新 更多