返回信息流看到下面 c++ 的函数声明:
template<class F, class... Args>
auto ThreadPool::enqueue(F&& f, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type>
那个 -> 是什么作用? 是要配合 auto 一起使用么?
这是一条镜像帖。来源:北邮人论坛 / cpp / #94009同步于 2016/11/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c++ 函数定义返回 auto
hyx2011
2016/11/21镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
这样有什么用么?完全可以放到前面去啊感觉
【 在 nuanyangyang 的大作中提到: 】
: 另一种语法。这样可以把返回值类型写到参数类型的后边。
【 在 hyx2011 的大作中提到: 】
: 这样有什么用么?完全可以放到前面去啊感觉
:
1. 这样写漂亮。本来就应该先写变量名后写类型;先写参数后写返回值。比较摩登的语言,比如X10,Scala,Go,Rust,Swift,TypeScript,Python(可选的静态标注),都是这样的;而老一辈的语言,比如C,C++,Java,C#什么的都是先类型后变量名,先返回值后参数的。
摩登的写法有好处,比如Scala:
val x: Int = 10
var y: Long = 5
def f(a: Int, b: Double): Float = { ... }
解析器看到val就知道要定义常量,看到var就知道要定义变量,看到def就知道要定义函数。然后val,var,def之后的第一个标识符一定是常量、变量、函数的名字。之后才是类型、参数。一切都是这么的一致。但C语言解析器看到下面这个东西的时候,怎么知道它(f)到底是函数还是指针还是数组呢:
double (*(*f(int a, char b))[100])(void*, long)
要是坚持先参数后返回值的写法就清楚多了:
def f(a: Int, b: Char): Array[(AnyRef, Long) => Double]
// f是一个函数,取Int和Char为参数,返回一个数组的引用,这里面每个元素都是一个函数的引用,每个函数取AnyRef和Long为参数,返回Double。
2. 有的函数,返回值类型会取决于参数类型(和泛型有关),这种情况下,为了C++编译器实现方便,要求先写参数类型,后写返回值类型。返回值类型自然就到了后边了。
【 在 nuanyangyang 的大作中提到: 】
:
: 1. 这样写漂亮。本来就应该先写变量名后写类型;先写参数后写返回值。比较摩登的语言,比如X10,Scala,Go,Rust,Swift,TypeScript,Python(可选的静态标注),都是这样的;而老一辈的语言,比如C,C++,Java,C#什么的都是先类型后变量名,先返回值后参数的。
: 摩登的写法有好处,比如Scala:
: ...................
果然是暖神。。。。
是否漂亮存疑。自己不认为写在前面后面漂亮程度有差别。
C++他爹FAQ解释(中文翻译)在这里:
https://wizardforcel.gitbooks.io/cpp-11-faq/content/37.html