Разница между `T &` и `const T &` для универсального класса - PullRequest
8 голосов
/ 13 февраля 2012

Предположим, у меня есть такой класс:

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 написал хороший ответ , который, к сожалению, в этом случае не поможет, я думаю, было бы неплохо подчеркнуть, что это очень много о что вы можете сделать, когда у вас уже есть ссылка (обратите внимание на все эти «обращения»), а не о том, что вы можете привязать к ссылке.

Итак, вы можете предположить, что ссылка ужетам, привязанный к некоторому объекту.Теперь все о том, что с этим можно сделать.

1 Ответ

13 голосов
/ 13 февраля 2012

Я не уверен, что это то, что вы ищете, но рассмотрите эту функцию:

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 может потенциально связываться с временной Foo, когда ссылка не const не может. Следовательно, вы, вероятно, захотите, чтобы функции, принимающие Foo s, принимали const Foo&, а не Foo&, чтобы можно было вызывать функцию с временными значениями.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...