5516 Example Name
1548 Bob Jones
604 James Jones
100 AAA
100 BBB
为什么第一个函数不能编译? 我对星号*应该使用变量/函数名还是使用修饰符感到困惑?
答案 0 :(得分:1)
auto f() -> T
声明一个函数f
,该函数返回类型为T
的值。这里的auto
不是占位符类型。就在这里,因为这就是带有尾随返回类型的函数声明符的语法,看起来像[dcl.fct]/2。声明带有尾随返回类型的函数时,不会进行类型推导。尾随返回类型只是用于编写显式返回类型的一种替代语法,该显式返回类型恰好也包含关键字auto
,但其容量不同于其正常值。
另一方面,像这样的声明符
auto f()
使用auto
作为占位符类型,这意味着要推导出已声明函数的返回类型。
此
auto *bar(decltype(foo) *a) -> F
使用auto
作为占位符返回类型(它向其中添加*
,仅在将auto
用作占位符类型时才有意义),但它还会尝试对末尾的尾随返回类型。那不是工作原理。您可以 使用尾随返回类型或占位符类型。两者同时没有任何意义。您要么想推导一种类型,要么想说出应该是什么类型……
此
auto bar2(decltype(foo)* a) -> F*
之所以起作用,是因为该声明符只声明了一个尾随返回类型为F*
的函数…