使用C ++尾随返回类型时auto的含义是什么?

时间:2012-09-01 02:01:32

标签: c++ c++11

而不是通常的

void foo (void ) {
    cout << "Meaning of life: " << 42 << endl;
}
使用追踪回报

C++11允许是另一种选择

auto bar (void) -> void {
    cout << "More meaning: " << 43 << endl;
}

在后者 - auto旨在表示什么?

另一个例子,考虑功能

auto func (int i) -> int (*)[10] {

}

同样的问题,这个例子中auto的含义是什么?

3 个答案:

答案 0 :(得分:16)

考虑一下代码:

template<typename T1, typename T2>
Tx Add(T1 t1, T2 t2)
{
    return t1+t2;
}

这里的返回类型取决于表达式t1+t2,而表达式Add又取决于Add(1, 1.4); 的调用方式。如果你把它称为:

T1

intT2doubledouble。生成的类型现在是Tx(int + double)。因此, auto 应该(必须)使用-> template<typename T1, typename T2> auto Add(T1 t1, T2 t2) -> decltype(t1+t2) { return t1+t2; }

指定
{{1}}

您可以在my article中阅读相关内容。

答案 1 :(得分:14)

通常,C ++ 11中的新关键字auto表示表达式的类型(在本例中是函数的返回类型)应该从表达式的结果中推断出来,在这种情况下,->之后发生的事情。

没有它,函数将没有类型(因此不是函数),编译器最终会感到困惑。

答案 2 :(得分:1)

我认为答案相对简单,这里的其他答案没有涉及。

基本上,如果没有 auto,就会存在歧义,因此委员会决定“您需要在此处使用 auto 以避免这些歧义”。

class A {
    T B;
};

class B;

A* f();

f()->B;

现在,f()->B 是什么意思?它是一个没有参数返回 B(带有尾随返回类型语法)的函数,还是一个对 A* f() 的函数调用?

如果我们没有在尾随返回类型语法的开头需要 auto,我们将无法分辨。使用 auto,很明显这是一个函数调用。

因此,为了避免此处的不清楚,我们只需在使用尾随返回类型的任何函数声明的开头require auto