【问题标题】:Non const lvalue references非 const 左值引用
【发布时间】:2013-09-02 03:08:05
【问题描述】:

你为什么可以这样做

int a;
const double &m = a;

但是当你这样做时

int a;
double &m = a;

你得到一个错误?

error: non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int'

编辑:

更具体地说,我试图了解非常量引用无法绑定临时对象的原因。

【问题讨论】:

  • 这个问题可以用以下两种方式之一来解释:要么你需要知道有一个规则允许 const 引用绑定到临时值,要么你想知道为什么。您可能会得到这两种答案,但您可能只对其中一种感兴趣……是哪一种?
  • 这里的错误信息有点混乱。我会期待一些像 - error: invalid initialization of non-const reference of type ‘double&’ from an rvalue of type ‘double’.

标签: c++


【解决方案1】:

这是因为临时不能绑定到非常量引用。

double &m = a;

a 的类型为int,正在转换为double。所以创建了一个临时的。用户定义类型也是如此。

Foo &obj = Foo(); // You will see the same error message.

但在 Visual Studio 中,它可以正常工作,因为默认启用了编译器扩展。但 GCC 会抱怨。

【讨论】:

  • 我投了反对票,因为您缺少解决方案。只需多写一个句子,所有问题都消失了。你会在“Foo &obj = Foo();”中做什么案例?
  • @AbbasPerçin 问题中已经给出了解决方案:只需将其设为常量: const Foo &obj = Foo();
  • @AbbasPerçin 的问题是为什么而不是如何,所以我认为这个答案没有错。
【解决方案2】:

因为对临时对象进行修改是没有意义的,所以 C++ 不希望您将非常量引用绑定到临时对象。 例如:

int a;
double &m = a;  // caution:this does not work.

如果它有效怎么办?
a 是 int 类型,并且正在转换为 double。所以创建了一个临时的。

你可以修改m,绑定一个临时的,但是几乎什么都没有发生。修改后变量a没有变化(更糟糕的是?你可能会认为a发生了变化,这可能会导致问题)。

【讨论】:

  • 但是如果临时包含指向其他资源的指针怎么办?那么临时做修改也不是没有意义。
  • @Enzo 这看起来不是一个好习惯。或者你可以在这里展示一个很好的例子?
  • @Enzo 如果临时对象包含指向其他资源的指针,则应使用移动构造函数进行处理。临时对象无论如何都会被删除,所以我认为你不应该对它做任何重要的事情。
  • @xinnjie,允许可变临时对象在某些情况下可能很有用。例如write_data_to ( Writeable_File ( "/some/path" ) ); 在这种情况下,存在比临时 Writeable_File 对象更持久的副作用。我可以想到其他涉及过滤或调整某些算法的输入或输出的示例。我可以想到其他示例,这些示例涉及在某些算法中封装可变状态级别。例如,解析器可以从临时词法分析器中提取输入。但是,无论好坏,C++ 都不支持传递可变临时对象。
  • @mpb mutable temporaries 使人们容易犯错。至于你的例子,移动 setantic 可能有帮助吗? write_data_to ( Writeable_File&& ) ) 之类的东西,变量的生命圈更加清晰。但毕竟,我同意你的观点,支持传递可变临时对象在某些用法中很方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多