为什么std :: begin使用尾随返回类型语法?

时间:2017-11-13 10:23:14

标签: c++ c++11 return auto decltype

范围访问函数std::begin声明如下(对于容器):

template< class C >
auto begin( C& c ) -> decltype(c.begin());

我只是想知道为什么它不仅仅是

template< class C >
decltype(C::begin) begin( C& c );

这两者有什么区别吗?

2 个答案:

答案 0 :(得分:8)

等效代码为

template< class C >
decltype(::std::declval<C &>().begin()) begin( C& c );

更长,可能更容易出错。

答案 1 :(得分:3)

此版本

template< class C >
decltype(C::begin) begin( C& c )

不会工作,因为

  1. decltype(C::begin)表示方法的类型,而不是方法调用的结果类型,无论如何
  2. begin方法为标准容器重载,没有函数调用的上下文(即使没有评估),编译器将无法决定应该参与哪个重载
  3. VTT显示的std::declval版本通过创建未评估的函数调用上下文来修复,可以解决重载问题。使用尾随decltype代替保存重复参数类型。