所有const类的`T&`和`const T&`之间的区别

8 c++ const language-lawyer

假设我有一个这样的类:

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
};
Run Code Online (Sandbox Code Playgroud)

现在,通过a访问这个类的对象之间有什么实际的区别Foo&,而const Foo&不是这两个是两个不同的类型吗?

访问它们的字段应该没有任何区别,因为const它们将通过const T&无论如何被访问.

但是,作为一个整体来说,这是否有任何区别?或许与模板有关?什么?


既然templatetypedef已经写了一个很好的答案,遗憾的是在这种情况下没有用,我认为很好地强调一下,当你已经有了一个引用(注意所有这些"访问")时你会做些什么呢?,而不是你可以绑定到参考.

所以,你可以假设ref已经存在,绑定到某个对象.现在一切都是关于它可以做些什么.

tem*_*def 13

我不确定这是否是您正在寻找的,但请考虑以下功能:

void DoSomething(Foo& fooRef);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你不能打电话

DoSomething(Foo()); // Error- can't bind a reference to a temporary
Run Code Online (Sandbox Code Playgroud)

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

void DoSomethingConst(const Foo& fooRef);
Run Code Online (Sandbox Code Playgroud)

那我们确实可以打电话

DoSomethingConst(Foo()); // Okay - const reference can bind to a temporary
Run Code Online (Sandbox Code Playgroud)

因此,当非引用不能时,const引用可能会绑定到临时值Foo,这有一点点差别const.因此,您可能希望使用Foos中的函数来接受const Foo&而不是Foo&使用临时函数来调用函数.

希望这可以帮助!

  • @SethCarnegie实际上,大多数优化只有在系统可以确定对象本身是"const"时才有效.通过`const`引用访问没有帮助(但声明`const`成员可能). (2认同)