Значение "const → std::string const &" после определения функции?
Чтение ответа для одного упражнения в С++ Primer, 5th Edition, я нашел этот код:
#ifndef CP5_ex7_04_h
#define CP5_ex7_04_h
#include <string>
class Person {
std::string name;
std::string address;
public:
auto get_name() const -> std::string const& { return name; }
auto get_addr() const -> std::string const& { return address; }
};
#endif
Что делает
const -> std::string const&
означает в этом случае?
Ответы
Ответ 1
auto get_name() const -> std::string const& { return name; }
- обратная запись типа возвращаемого значения для эквивалентного
std::string const& get_name() const { return name; }
Обратите внимание, что эквивалентность точна в том смысле, что вы можете объявить функцию с использованием одного синтаксиса и определить ее с другим.
(Это было частью стандарта С++ с и включая С++ 11).
Ответ 2
Часть -> std::string const&
является обратным типом возвращаемого типа и является новым синтаксисом с С++ 11.
Первый const
говорит, что это функция члена const
. Он может быть безопасно вызван объектом const
типа Person
.
Вторая часть просто сообщает, что тип возврата - std:string const&
.
Это полезно, когда тип возвращаемого значения должен быть выведен из аргумента шаблона. Для известных типов возврата это не более полезно, чем использование:
std::string const& get_name() const { return name; }
Ответ 3
Все это имеет смысл, когда вы видите пример, где это действительно имеет значение; как написано в вопросе, это просто альтернативный способ объявления возвращаемого типа.
Если у вас есть функция шаблона, в которой вы не можете заранее знать тип возврата, это может реально помочь. Например:
template <class X, class Y> auto DoSomeThing(X x, Y y) -> decltype(x * y);
Вы не знаете, какие типы X
и Y
на самом деле есть, но вы знаете, что возвращаемое значение будет иметь тот же тип, что и x * y
, который можно вывести таким образом.
Ответ 4
const
является cv-qualifier обычного типа для функции-члена: *this
есть const
внутри функции.
-> std::string const&
пары с auto
для формирования типа возвращаемого возврата (см. (2)). Разница здесь только синтаксическая: следующий синтаксис эквивалентен:
std::string const& get_name() const { return name; }