“的含义;常数->;std::字符串常量&&引用;在函数定义之后? 阅读C++第五版中一个练习题的答案,我发现这个代码: #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

“的含义;常数->;std::字符串常量&&引用;在函数定义之后? 阅读C++第五版中一个练习题的答案,我发现这个代码: #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,c++,c++14,C++,C++14,在这种情况下是什么意思?auto-get_-name()const->std::string const&{return-name;}是等效的尾部返回类型表示法 std::string const&get_name()const{return name;} 请注意,等价性的确切含义是,可以使用一种语法声明函数,并使用另一种语法定义函数 (这是C++标准中的一部分,包括C++ 11)。 >代码> const 是成员函数的一种常见类型: *此< /代码>是函数>代码> const 。 ->std::

在这种情况下是什么意思?

auto-get_-name()const->std::string const&{return-name;}
是等效的尾部返回类型表示法

std::string const&get_name()const{return name;}

请注意,等价性的确切含义是,可以使用一种语法声明函数,并使用另一种语法定义函数

(这是C++标准中的一部分,包括C++ 11)。<> >代码> const 是成员函数的一种常见类型:<代码> *此< /代码>是函数>代码> const <代码>。

->std::string const&
auto
配对,形成一个字符串(见(2))。这里的区别只是语法上的——以下语法是等效的:

std::string const& get_name() const { return name; }

std::string const&部分是尾部返回类型,是自C++11以来的新语法

第一个
const
表示它是
const
成员函数。可以在类型为
Person
const
对象上安全地调用它

第二部分简单地告诉我们返回类型是什么-
std:string const&

当需要从模板参数推导返回类型时,它非常有用。对于已知的返回类型,它并不比使用:

std::string const& get_name() const { return name; }

当你看到一个真正重要的例子时,这一切就更有意义了;如问题中所述,这只是声明返回类型的另一种方法

如果您有一个模板函数,无法预先知道返回类型,这实际上会有所帮助。例如:

template <class X, class Y> auto DoSomeThing(X x, Y y) -> decltype(x * y);
template auto DoSomeThing(X X,Y)->decltype(X*Y);

您不知道
X
Y
实际上是什么类型,但您知道返回值将具有与
X*Y
相同的类型,可以通过这种方式进行推导。

尾部返回类型语法。基本上,
auto func()->type
=
type func()
,但第一个具有更多功能。在你的例子中,它没有任何优点,可能是因为编写代码的人喜欢它比普通语法更喜欢。这意味着它是一个只得到属性。@ FiSTEST: C++没有“属性”。@析构函数见:@ FiSTESTEP:C++没有“方法”。@ MalkSaSOM:C++ 11。无论何时编写lambda,您都会使用它(尽管在实践中很多时候您可能会省略尾随返回类型)。您也可以看到,在阿尔夫写C++答案的地方,代码“>自动主程序”-> int {} /代码>我知道,但是1)直到你告诉我我才知道,2)我不喜欢编辑别人的答案,这似乎有点粗鲁。附言3)让人们考虑留下更好的答案总是好的。@Markransem:你可以说“谢谢你的信息”:P@user:否,C++03语法已经允许
std::string const&get_name()const新语法的目的是在处理返回类型时,在词法范围中有更多的名称,这在使用C++11中的@Destructor时非常方便。在C++14中,我不知道这是为什么(我很想说这实际上是一个编译器错误,但无论是全新的clang还是全新的GCC都不喜欢它;)。显然,如果你像个好孩子一样省略了
返回0
,那么这一切都将毫无意义;)
template <class X, class Y> auto DoSomeThing(X x, Y y) -> decltype(x * y);