而不是通常的
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
的含义是什么?
答案 0 :(得分:16)
考虑一下代码:
template<typename T1, typename T2>
Tx Add(T1 t1, T2 t2)
{
return t1+t2;
}
这里的返回类型取决于表达式t1+t2
,而表达式Add
又取决于Add(1, 1.4);
的调用方式。如果你把它称为:
T1
int
为T2
,double
为double
。生成的类型现在是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
。