2014-01-13 69 views
18

我碰巧在C++ 11的视频,在这里笔者使用auto main() - > int是什么意思?

auto main()->int 

我没看明白碰到下面的代码片段。我试图编译g++使用-std=c++11,它的工作原理。 有人可以向我解释这里发生了什么事吗?我试图用“auto main() - > int”进行搜索,但没有找到任何帮助。

回答

35

C++ 11引入用于后返回类型的符号:如果函数声明与auto引入,则返回类型的参数和一个->序列之后被指定。也就是说,所做的只是宣布main()返回int

追溯返回类型的重要性主要针对函数模板,现在可以将函数的参数与decltype()一起用于确定返回类型。例如:

template <typename M, typename N> 
auto multiply(M const& m, N const& n) -> decltype(m * n); 

此声明函数multiply()返回由m * n生产的类型。在multiply()前面使用decltype()将是无效的,因为mn尚未声明。

尽管它主要用于函数模板,但其他函数也可以使用相同的表示法。使用C++ 14时,在某些情况下使用auto引入函数时,甚至可以省略尾随返回类型。

+12

以这种方式声明main的优点是什么? –

+6

@PaperBirdMaster:我并不是说有优势。但是,这是允许的,并且不会比替代方案更糟糕。 –

+2

对不起,误解,我不是说你说'main'上的结尾返回类型(TRT)有优势,我只是问(并且想知道)这个TRT的使用是否有优势在这种情况下......我认为包括这个解释(如果有的话)将会很好地改善答案 –

7

它被称为追尾型。它在使用模板的通用代码中特别有用,其中返回类型取决于涉及其他模板参数的表达式。它也用于lambda。

下面是一个例子:

template<typename T, typename U> 
auto add(T t, U u) -> decltype(t+u) 
{ 
    return t + u; 
} 

这里返回类型依赖于表达t+u。因此,无论表达式的类型是否也是函数的返回类型,这由decltype(t+u)指示。

11

这是一个统一函数声明语法,尾随返回类型,在C++ 11中引入。

对于lamdas,不能使用任何其他语法,对于结果类型依赖于参数的函数模板也是非常方便的。

如果您想选择一个单一的语法(我认为这是一个好主意),那么你就没有任何选择:旧的语法不能用于lambda表达式。

理由这样做,包括:

  • 好了,语法。

  • 功能名称始终在视觉上相同的地方,支持代码的快速扫描。

  • 同上的结果类型,简单的视觉识别(加上,你不必限定它,当它是一个成员函数的类中定义的类型)。针对

的原因包括一些额外的冗长,用老的编译器不理解这种语法,即任何新的东西可以感觉到可怕的,不舒服,只是奇怪。

+3

+1。我甚至在正常代码中也使用这种语法:*功能名称始终在视觉上相同的位置,支持快速扫描代码*。对我们来说,人类很容易很容易找出函数的名字,因为在'auto'之后,函数名被写入。所有功能的视觉效果都一样。 – Nawaz

+7

**我个人发现'auto main() - > int'是一个可怕的想法。** *“嗯,单个语法。”*除了那些已经存在的数百万行代码。无论如何,它都是旧代码的混合语法。 *“功能名称始终在可视化的相同位置,支持代码的快速扫描。”*我使用由我的IDE生成的轮廓,扫描速度更快。 *“结果类型同上,简单的视觉识别”。*为什么在'main main() - > int'中比在int main()'中找到返回类型要容易得多,返回类型在前面,我不需要通读任何东西来找出它? – Ali

+3

@Ali:re“为什么找到auto main() - > int中的返回类型要比int main()中的返回类型更容易,在这种情况下返回类型是正确的,我不必通读任何东西来查找它出来“,当你发现有必要攻击稻草人的论点时,你承认没有真正的论点。然而,恐怖和厌恶的感觉是不做某事的正当理由。不管感情如何非理性,它们确实会影响一个人的行为,而且可能不必要与他们作斗争。 –