Значение "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; }