我遇到了以下代码:

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

有一件事我不能理解

我可以在哪里找到箭头操作符(->)在函数标题中的意思?

从逻辑上讲,->操作符决定了一个类型,auto将被推导为,但我想把它弄清楚。我找不到任何信息。


当前回答

在c++ 11中,函数声明有两种语法:

返回类型标识符(参数声明…)

and

自动标识符(参数-declarations…)- > return_type

它们是等价的。当它们相等时,为什么还要用后者呢?c++ 11引入了这个很酷的decltype,让你可以描述表达式的类型。你可能想从参数类型中派生返回类型。所以你试着:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

编译器会告诉你它不知道decltype参数中的a和b是什么。这是因为它们只由参数列表声明。

通过使用declval和已经声明的模板参数,可以轻松地解决这个问题。如:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

只是现在变得很啰嗦了。因此,提出并实现了替代声明语法,现在您可以编写

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

而且它不那么冗长,范围规则也不需要更改。


c++ 14更新:c++ 14还允许

自动标识符(参数-declarations…)

只要函数在使用之前完全定义,并且所有return语句都推导为相同的类型。如果您想在源文件中隐藏主体,那么->语法对于公共函数(在头文件中声明)仍然很有用。显然,这不能用模板来完成,但是有一些具体的类型(通常通过模板元编程派生)很难用其他方法来编写。

其他回答

简单地说,它告诉我们返回类型是a和b的和的推断类型。

在c++ 11中,函数声明有两种语法:

返回类型标识符(参数声明…)

and

自动标识符(参数-declarations…)- > return_type

它们是等价的。当它们相等时,为什么还要用后者呢?c++ 11引入了这个很酷的decltype,让你可以描述表达式的类型。你可能想从参数类型中派生返回类型。所以你试着:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

编译器会告诉你它不知道decltype参数中的a和b是什么。这是因为它们只由参数列表声明。

通过使用declval和已经声明的模板参数,可以轻松地解决这个问题。如:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

只是现在变得很啰嗦了。因此,提出并实现了替代声明语法,现在您可以编写

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

而且它不那么冗长,范围规则也不需要更改。


c++ 14更新:c++ 14还允许

自动标识符(参数-declarations…)

只要函数在使用之前完全定义,并且所有return语句都推导为相同的类型。如果您想在源文件中隐藏主体,那么->语法对于公共函数(在头文件中声明)仍然很有用。显然,这不能用模板来完成,但是有一些具体的类型(通常通过模板元编程派生)很难用其他方法来编写。

除了decltype和declval用法之外,还可以使用类中定义的返回类型定义类成员函数,而不需要第二次提供class::作用域解析前缀。

例子:

class SomeLongClassname
{
public:
  typedef std::shared_ptr<Node> PNode;

  PNode make_node ();
};

选择:

SomeLongClassname::PNode SomeLongClassname::make_node () { ... }

or

auto SomeLongClassname::make_node () -> PNode { ... }

第二种形式有时更容易辨认。