在 C ++ 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&
在这种情况下意味着什么?
答案 0 :(得分:21)
auto get_name() const -> std::string const& { return name; }
是等效
std::string const& get_name() const { return name; }
请注意,等效是 exact ,因为您可以使用一种语法声明一个函数,并使用另一种定义。< / p>
(这是C ++标准的一部分,包括C ++ 11)。
答案 1 :(得分:9)
部分-> std::string const&
是尾随返回类型,是自C ++ 11以来的新语法。
第一个const
称它为const
成员函数。可以在const
类型的Person
对象上安全地调用它。
第二部分只是告诉返回类型是什么 - std:string const&
。
当需要从模板参数推导出返回类型时,它很有用。对于已知的返回类型,它不比使用:
更有用std::string const& get_name() const { return name; }
答案 2 :(得分:4)
当你看到一个真正重要的例子时,这一切都更有意义;如问题所述,它只是一种声明返回类型的替代方法。
如果您有一个模板功能,您无法提前知道返回类型,这实际上可以提供帮助。例如:
template <class X, class Y> auto DoSomeThing(X x, Y y) -> decltype(x * y);
您不知道X
和Y
实际上是什么类型,但您知道返回值与x * y
具有相同的类型,可以通过这种方式推断出来。
答案 3 :(得分:3)
const
是成员函数的常用cv-qualifier:*this
在函数内是const
。
-> std::string const&
与auto
成对,形成trailing return type(见(2))。区别仅在于语法 - 以下语法是等效的:
std::string const& get_name() const { return name; }