【问题标题】:Difference between `T&` and `const T&` for all-const class所有 const 类的 `T&` 和 `const T&` 之间的区别
【发布时间】:2012-02-13 18:55:19
【问题描述】:

假设我有这样的课程:

class Foo : boost::noncopyable
{
public:
  Foo(int a, int b);

  const int something;
  const int something_else;
  const std::string another_field;
  // and that's that, no more methods nor fields
};

现在,通过Foo&const Foo& 访问此类的对象之间有什么实际区别,除了这两者是两种不同的类型?

访问其字段应该没有任何区别,因为它们是const,因此无论如何都将通过const T&访问它们。

但是就整个班级而言,任何有什么不同吗?也许与模板有关?有什么事吗?


现在templatetypedef has written a nice answer,不幸的是在这种情况下没有帮助,我认为最好强调一下当你已经有参考时你能做什么(请注意所有这些“访问”),而不是您可以绑定到引用的内容。

因此,您可以假设 ref 已经存在,并绑定到某个对象。现在是关于可以用它做什么。

【问题讨论】:

  • 附带说明,如果您有两个Foos,分别称为ab,则分配a = b 是非法的。这就是你想要的吗?
  • @FredOverflow:是的,它甚至是明确的:class Foo : boost::noncopyable

标签: c++ constants language-lawyer


【解决方案1】:

我不确定这是否是您要查找的内容,但请考虑以下功能:

void DoSomething(Foo& fooRef);

在这种情况下,您不能调用

DoSomething(Foo()); // Error- can't bind a reference to a temporary

但是,如果我们有这个功能:

void DoSomethingConst(const Foo& fooRef);

那么我们确实可以调用

DoSomethingConst(Foo()); // Okay - const reference can bind to a temporary

因此,当非const 引用不能绑定时,const 引用可以潜在地绑定到临时Foo,这点略有不同。因此,您可能希望接收Foos 的函数接收const Foo& 而不是Foo&,以便使用临时函数调用函数。

希望这会有所帮助!

【讨论】:

  • +1。编译器是否还可以为const 做一些优化?
  • @SethCarnegie 我想过这个问题,但是由于所有成员都是 const,所以优化不能发生吗?我也 +1。
  • 哦,虽然这很明显,但更多的是关于可以绑定到引用的内容,而不是访问它时可以做什么。而且我怀疑我是否需要制作这种类型的临时作品。所以虽然我很感谢你的回答,但我不能诚实地支持它。
  • @SethCarnegie:实际上,const 很少有助于优化,编译器通常从自己的数据流分析中获得比从 consts 获得的更准确的信息。
  • @SethCarnegie 实际上,大多数优化只有在系统可以确定对象本身是const 时才有效;通过const 引用访问没有帮助(但声明const 成员可能)。
猜你喜欢
  • 2013-07-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2021-11-05
  • 2019-10-30
  • 1970-01-01
  • 2019-09-04
  • 2013-04-23
相关资源
最近更新 更多