Існує мало користі в додаванні constкваліфікації до неопорної / НЕ покажчик rvalues, і немає сенсу в додаванні його вбудованих модулів.
У разі певного користувача типів , A constкваліфікація буде перешкоджати викликають абонентам від виклику до не- constфункції - члена на повернутому об'єкті. Наприклад, дано
const std::string foo();
std::string bar();
тоді
foo().resize(42);
було б заборонено, поки
bar().resize(4711);
буде дозволено.
Для вбудованих подібних int це взагалі не має сенсу, оскільки такі значення r не можуть бути змінені.
(Я пам'ятаю , Ефективне використання C ++ обговорює зробити тип повернення operator=()в constзасланні, хоча, і це що - то розглянути.)
Редагувати:
Здається, Скотт справді дав таку пораду . Якщо так, то з причин, наведених вище, я вважаю це сумнівним навіть для C ++ 98 та C ++ 03 . Що стосується С ++ 11, я вважаю це абсолютно неправильним , як, здається, виявив сам Скотт. В помилці для ефективного C ++, 3-е видання. , він пише (або цитує інших, хто скаржився):
З тексту випливає, що всі повернення за значеннями повинні бути const, але випадків, коли повернення за значенням non-const є гарним дизайном, важко знайти, наприклад, типи повернення std :: vector, де абоненти будуть використовувати swap з порожнім вектором "захопити" вміст поверненого значення без їх копіювання.
А пізніше:
Оголошення за значенням функції, що повертає значення const, запобіжить їх прив’язку до посилань rvalue у C ++ 0x. Оскільки посилання на rvalue розроблені, щоб допомогти підвищити ефективність коду на C ++, важливо враховувати взаємодію повернутих значень const та ініціалізацію посилань на rvalue при зазначенні підписів функцій.