Зачем возвращать константную ссылку маленьким ученикам? - PullRequest
0 голосов
/ 02 мая 2018

Мне кажется, что этот вопрос наверняка где-то на SO, но я либо не могу найти правильные условия поиска, либо его как-то пропустили.

Предположим, у меня есть класс, который защищает своих членов вот так ...

class MyClass {
   int m_value;
public:
   MyClass(int v) : m_value(v) {}
   int value() const { return m_value; }
}

Я видел пример кода по всему SO, который вместо этого возвращает константную ссылку на переменную-член, например ...

class MyClass {
   int m_value;
public:
   MyClass(int v) : m_value(v) {}
   const int& value() const { return m_value; }
// ^^^^^^^^^^
}

Я понимаю значение возврата const в целом и значение возврата ссылок для составных объектов, но каково значение для объектов меньше размера указателя архитектуры? Кажется, что он менее эффективен и менее безопасен, без какого-либо преимущества.


Я предполагаю, что подобное обсуждение могло бы быть проведено для конструктора в моем примере, но этот вопрос сосредоточен на возвращаемых значениях здесь.

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

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Если вы говорите только о int, то да, это может быть бессмысленно. Но когда вы знаете, что возвращаемый тип или тип параметра могут быть изменены позже, и вы используете псевдоним, может быть полезно ввести const &, поэтому позже все, что вам нужно сделать, это изменить значение псевдонима, которое может быть больше 8 байт. Как это

class MyClass {
   using TInnerType = int;
   TInnerType m_value;
public:
   MyClass(const TInnerType& v) : m_value(v) {}
   const TInnerType& value() const { return m_value; }
// ^^^^^^^^^^
}
0 голосов
/ 02 мая 2018

Зачем возвращать постоянную ссылку на маленьких учеников?

Зависит от того, хотите ли вы, чтобы вызывающая сторона могла связать ссылку с m_value.

MyClass myObj;
int const& keep_an_eye_on_you = myObj.value();
cout << "Was: " << keep_an_eye_on_you << endl;
myObj.doSomething(); // say this changes the value held in m_value
cout << "Now: " << keep_an_eye_on_you << endl;

Если m_value является фактически неизменяемым, то это не имеет значения (кроме проблем производительности, которые выразили другие).

Если m_value может меняться со временем, то привязка вызывающего будет отражать текущее состояние, как в примере выше.

0 голосов
/ 02 мая 2018

Возвращение const & к типу, подобному int, вероятно, совершенно бессмысленно и, возможно, снижает производительность. То же самое можно сказать о передаче const int& в качестве типа параметра функции, но это немного более приемлемо в том смысле, что он побеждает нежелательные преобразования типов на вызывающем сайте.

Это просто плохая привычка, в которую попал программист.

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