函数声明中的 C++ 中的 -> 是什么
what is -> in c++ in a function declaration
在维基百科关于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);
}
虽然我理解这个函数背后的动机,但我不理解它使用的语法,特别是声明中的->
。什么是->,它是如何解释的?
编辑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
对EDIT 1的回答:
哦!我忘了在g++中使用-std=c++11
编译器选项。
编辑2
根据下面的答案。我有一个相关的问题:看下面的声明:
template <typename T1, typename T2>
decltype(*(T1 *) nullptr + *(T2 *) nullptr) sum2(T1 v1, T2 v2);
在函数声明中使用decltype
而不需要->
。那么为什么我们需要->
使用尾随返回类型表示法。:
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而不需要在函数声明中使用->。那么为什么我们需要->
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>