【发布时间】:2014-01-13 06:50:29
【问题描述】:
我在C++11的一个视频中碰巧看到了下面的代码sn-p,作者用的地方
auto main()->int
我不明白这一点。我尝试使用-std=c++11 在g++ 中编译,它可以工作。
有人可以向我解释这里发生了什么吗?我尝试使用“auto main()->int”进行搜索,但没有找到任何帮助。
【问题讨论】:
我在C++11的一个视频中碰巧看到了下面的代码sn-p,作者用的地方
auto main()->int
我不明白这一点。我尝试使用-std=c++11 在g++ 中编译,它可以工作。
有人可以向我解释这里发生了什么吗?我尝试使用“auto main()->int”进行搜索,但没有找到任何帮助。
【问题讨论】:
它被称为尾随返回类型。它在使用模板的泛型代码中特别有用,其中返回类型取决于涉及一些其他模板参数的表达式。它也用于 lambda。
这是一个例子:
template<typename T, typename U>
auto add(T t, U u) -> decltype(t+u)
{
return t + u;
}
这里的返回类型取决于表达式t+u。所以无论表达式的类型是什么,也是函数的返回类型,由decltype(t+u)表示。
【讨论】:
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() 是无效的,因为尚未声明m 和n。
虽然它主要用于函数模板,但同样的符号也可以用于其他函数。在 C++14 中,在某些情况下使用 auto 引入函数时,甚至可以省略尾随返回类型。
【讨论】:
main 的尾随返回类型(TRT)有优势,我只是问(并想知道)是否有任何在这种情况下使用 TRT 的优势......我认为包括这个解释(如果有的话)会很好地改善答案
int、bool、char、void 或少于 5 个字符的模板类型,则没有真正的优势。但它确实将每个函数名称都从同一文本列开始。
template <typename T> auto size(T x) -> decltype(x.size()) {return x.size();},那么它只会在x.size() 是一个有效表达式的情况下参与重载决议。如果不是这种情况,编译器将搜索另一个重载。
这是一个统一的函数声明语法,尾随返回类型,在 C++11 中引入。
您不能对 lamdas 使用任何其他语法,对于结果类型取决于参数的函数模板也非常方便。
如果您想选择一种单一语法(我认为这是个好主意),那么您别无选择:旧语法不能用于 lambda。 p>
这样做的原因包括:
嗯,单个语法。
函数名在视觉上总是在同一位置,支持快速扫码。
结果类型同上,易于视觉识别(另外,当它是在成员函数的类中定义的类型时,您不必对其进行限定)。
反对的原因包括一些额外的冗长,使用不理解这种语法的旧编译器,任何新的东西都会让人感到害怕、不舒服和奇怪。
【讨论】:
auto 之后,函数名称被写入。所有功能的视觉效果都相同。
auto main() -> int 是一个可怕的想法。 “嗯,一个单一的语法。” 除了那些已经存在的数百万行代码.无论如何,这将是与旧代码的混合语法。 “函数名在视觉上始终在同一个地方,支持快速扫描代码。”我使用我的IDE生成的大纲,扫描速度更快。 “结果类型同上,易于视觉识别。” 为什么在auto main() -> int 中找出返回类型比在int main() 中更容易找到返回类型,我不知道不需要通读任何东西就能找到它?
auto main() -> int 中找到返回类型比在int main() 中更容易。
auto main() -> int 没有任何问题。