函数定义后的 "const -> std::string const&" 的含义是什么?

14

在阅读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

什么是IT技术?

const -> std::string const& 

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


4
“Trailing return type” 语法。基本上,auto func() -> type = type func(),但前者具有更多功能。在你的情况下,它没有优势,很可能是因为编写代码的人喜欢它比正常语法更多。 - HolyBlackCat
这意味着它是一个只读属性。 - Khalil Khalaf
7
@FirstStep:C++没有“属性”。 - Lightness Races in Orbit
2
@Destructor 请看这里:https://dev59.com/wlkT5IYBdhLWcg3wefbR#38541357 - HolyBlackCat
4
@FirstStep: C++没有"methods",可以翻译为:C++中没有“方法”。 - Lightness Races in Orbit
显示剩余3条评论
4个回答

21

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

是等价于使用传统语法:

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

尾置返回类型 符号表示法。

请注意,这种等价是精确的,即您可以使用一种语法声明函数并使用另一种语法定义它。

(此特性从C++11开始包含在C++标准中)。


12
C++11. 每当你编写一个 lambda 表达式时都会用到它(虽然在实践中,你很多时候可能会省略尾随的返回类型)。每当 Alf 在 SO 上编写 C++ 答案时,你也会看到这种怪物 auto main() -> int {} - Lightness Races in Orbit
3
@LightnessRacesinOrbit 我知道,但是1)在你告诉我之前,我并不知道,2)我不喜欢编辑别人的答案,这似乎有点粗鲁。P.S. 3)让人们思考如何留下更好的答案总是件好事。 - Mark Ransom
1
@MarkRansom:你本可以说“谢谢信息”啊 :P - Lightness Races in Orbit
2
@user:不,C++03语法已经允许std::string const& get_name() const;。新语法的目的是在处理返回类型时有更多的名称在词法作用域内,这在使用decltype时非常方便。 - Ben Voigt
2
@Destructor: 在C++11中,该功能对于函数不存在。在C++14中,它似乎不想与main一起使用,我不确定为什么(我倾向于说这实际上是编译器bug,但全新的clang和GCC都不支持;我已经请求了SO的建议)。显然,如果你像好孩子一样省略了return 0,那么所有这些都是无意义的 ;) - Lightness Races in Orbit
显示剩余9条评论

9
-> std::string const&是自C++11以来的新语法——后置返回类型。
第一个const表示它是一个const成员函数,可以在Person类型的const对象上安全调用。
第二部分简单地说明了返回类型是什么 - std:string const&
当需要从模板参数中推断返回类型时,这是非常有用的。对于已知的返回类型,它与使用以下内容一样有用:
std::string const& get_name() const { return name; }

4

当你看到一个实际重要的例子时,所有的内容都会更有意义; 如问题所述,这只是一种声明返回类型的替代方式。

如果你有一个模板函数,在事先无法知道返回类型的情况下,这种方法实际上可以帮助你。例如:

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

您可能不知道类型XY是什么,但您知道返回值的类型将与x * y相同,可以通过以下方式推断出来。


3

const是成员函数的常规cv限定符,有关该cv限定符的更多信息,请参见此处 :在函数内部,*thisconst

-> std::string const&auto配对形成尾返回类型(请参见(2))。这里只是语法上的不同 - 以下语法等效:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接