15

而不是平时

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同样的问题,这个例子中的含义是什么?

4

3 回答 3

18

一般来说,autoC++11 中的 new 关键字表示表达式的类型(在这种情况下是函数的返回类型)应该从表达式的结果中推断出来,在这种情况下,在->.

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

于 2012-09-01T02:03:38.247 回答
18

考虑代码:

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

这里的返回类型取决于表达式t1+t2,而表达式又取决于Add调用方式。如果您将其称为:

Add(1, 1.4);

T1int,而且T2double。结果类型现在是double(int+double)。因此Tx应该(必须)使用auto和指定->

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

你可以在我的文章中读到它。

于 2012-09-01T05:14:01.183 回答
1

我认为答案相对简单,这里的其他答案未涵盖。

基本上,没有auto,就会有歧义,因此委员会决定“您需要auto在这里避免这些歧义”。

class A {
    T B;
};

class B;

A* f();

f()->B;

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

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

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

于 2021-01-25T22:47:36.947 回答