在关于decltype
http://en.wikipedia.org/wiki/Decltype的维基百科文章中,我遇到了这个例子:
int& foo(int& i);
float foo(float& f);
template <class T> auto transparent_forwarder(T& t) −> decltype(foo(t)) {
return foo(t);
}
虽然我理解了这个函数背后的动机,但我并不理解它使用的语法,特别是声明中的->
。什么是 - &gt;它是如何解释的?
编辑1
基于以上所述:这里有什么问题?
template <typename T1, typename T2>
auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) {
return v1 + v2;
}
错误是:
error: expected type-specifier before ‘decltype’
error: expected initializer before ‘decltype
回答编辑1:
OOPS!我忘了在g ++中使用-std=c++11
编译器选项。
编辑2
基于以下答案。我有一个相关的问题:请看下面的声明:
template <typename T1, typename T2>
decltype(*(T1 *) nullptr + *(T2 *) nullptr) sum2(T1 v1, T2 v2);
在函数声明中使用decltype
而不需要->
。那么我们为什么需要->
答案 0 :(得分:10)
这使用尾随返回类型表示法。这样:
auto f() -> T { ... }
等同于:
T f() { ... }
优点是,使用尾随返回类型表示法,您可以根据涉及参数的表达式表示函数的类型,这是经典表示法无法实现的。例如,这是非法的:
template <class T>
decltype(foo(t)) transparent_forwarder(T& t) {
// ^^^^^^^^^^^^^^^^
// Error! "t" is not in scope here...
return foo(t);
}
关于你的编辑:
基于以上所述:这里有什么问题?
template <typename T1, typename T2> auto sum(T1 v1, T2 v2) -> decltype(v1 + v2) { return v1 + v2; }
没有
关于你的第二次编辑:
[...]使用decltype而不需要 - &gt;在函数声明中。那么我们为什么需要 - &gt;
在这种情况下,你不需要它。但是,使用尾随返回类型的符号更清晰,因此可能更喜欢它使代码更容易理解。