【问题标题】:Meaning of "const -> std::string const&" after the function definition?函数定义后“const -> std::string const&”的含义?
【发布时间】:2016-08-23 15:03:08
【问题描述】:

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

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

【问题讨论】:

  • 尾随返回类型语法。基本上,auto func() -&gt; type = type func(),但第一个有更多的功能。在您的情况下,它没有任何优势,可能是因为编写代码的人比普通语法更喜欢它。
  • 表示它是一个 get only 属性。
  • @FirstStep:C++ 没有“属性”。
  • @FirstStep:C++ 没有“方法”。

标签: c++ c++14


【解决方案1】:

auto get_name() const -&gt; std::string const&amp; { return name; }尾随返回类型等价的符号

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

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

(自 C++11 以来,这一直是 C++ 标准的一部分)。

【讨论】:

  • @MarkRansom:C++11。每当您编写 lambda 时都会使用它(尽管在实践中很多时候您可能会省略尾随返回类型)。您还将看到 auto main() -&gt; int {} 的怪物,只要 Alf 在 SO 上写了 C++ 答案;)
  • @LightnessRacesinOrbit 我知道,但是 1)我真的不知道,直到你告诉我,2)我不喜欢编辑其他人的答案,这似乎有点粗鲁。附言3) 让人们考虑留下更好的答案总是好的。
  • @MarkRansom:你可以说“谢谢你的信息”:P
  • @user: 不,C++03 语法已经允许std::string const&amp; get_name() const; 新语法的目的是在处理返回类型时在词法范围内拥有更多名称,这在使用时很方便decltype.
  • @Destructor:在 C++11 中,the feature doesn't exist for functions。在 C++14 中,it doesn't seem to want to work with main,我不知道为什么会这样(我想说这实际上是一个编译器错误,但全新的 clang 和全新的 GCC 都不高兴用它;I have asked SO for advice)。显然,如果您像一个好孩子一样省略了return 0,那么无论如何这一切都没有实际意义;)
【解决方案2】:

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

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

第二部分简单地说明返回类型是什么 - std:string const&amp;

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

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

【讨论】:

    【解决方案3】:

    当您看到一个真正重要的示例时,这一切都会变得更有意义;正如问题中所写,这只是声明返回类型的另一种方式。

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

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

    你不知道XY实际上是什么类型,但你知道返回值将与x * y具有相同的类型,可以通过这种方式推导出来。

    【讨论】:

      【解决方案4】:

      const 是成员函数常用类型的 cv-qualifier*this 在函数内部是 const

      -&gt; std::string const&amp;auto 配对形成trailing return type(参见(2))。区别只是这里的语法——下面的语法是等价的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-23
        • 1970-01-01
        • 2015-07-16
        • 2012-04-19
        • 2013-08-01
        • 1970-01-01
        相关资源
        最近更新 更多