【问题标题】:What is the meaning of auto main()->int?auto main()->int 是什么意思?
【发布时间】:2014-01-13 06:50:29
【问题描述】:

我在C++11的一个视频中碰巧看到了下面的代码sn-p,作者用的地方

auto main()->int

我不明白这一点。我尝试使用-std=c++11g++ 中编译,它可以工作。 有人可以向我解释这里发生了什么吗?我尝试使用“auto main()->int”进行搜索,但没有找到任何帮助。

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

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

    这是一个例子:

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

    这里的返回类型取决于表达式t+u。所以无论表达式的类型是什么,也是函数的返回类型,由decltype(t+u)表示。

    【讨论】:

    • 这真的很有帮助!
    【解决方案2】:

    C++11 为尾随返回类型引入了一种表示法:如果使用auto 引入函数声明,则返回类型将在参数和-&gt; 序列之后指定。也就是说,所做的只是声明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 引入函数时,甚至可以省略尾随返回类型。

    【讨论】:

    • 以这种方式声明 main 有什么好处?
    • @PaperBirdMaster:我并不是说有优势。但是,这是允许的,并且不比替代方案差。
    • 对不起,误会了,我不是说你说main 的尾随返回类型(TRT)有优势,我只是问(并想知道)是否有任何在这种情况下使用 TRT 的优势......我认为包括这个解释(如果有的话)会很好地改善答案
    • 如果返回类型为intboolcharvoid 或少于 5 个字符的模板类型,则没有真正的优势。但它确实将每个函数名称都从同一文本列开始。
    • TRT 的主要优势是它的SFINAE-友好性。例如,如果我编写了一个函数template &lt;typename T&gt; auto size(T x) -&gt; decltype(x.size()) {return x.size();},那么它只会在x.size() 是一个有效表达式的情况下参与重载决议。如果不是这种情况,编译器将搜索另一个重载。
    【解决方案3】:

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

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

    如果您想选择一种单一语法(我认为这是个好主意),那么您别无选择:旧语法不能用于 lambda。 p>

    这样做的原因包括:

    • 嗯,单个语法。

    • 函数名在视觉上总是在同一位置,支持快速扫码。

    • 结果类型同上,易于视觉识别(另外,当它是在成员函数的类中定义的类型时,您不必对其进行限定)。

    反对的原因包括一些额外的冗长,使用不理解这种语法的旧编译器,任何新的东西都会让人感到害怕、不舒服和奇怪。

    【讨论】:

    • +1。即使在普通代码中,我也正是为此使用了这种语法:函数名称在视觉上总是在同一个地方,支持快速扫描代码。我们人类很容易找出函数的名称,因为就在auto 之后,函数名称被写入。所有功能的视觉效果都相同。
    • 我个人认为auto main() -&gt; int 是一个可怕的想法。 “嗯,一个单一的语法。” 除了那些已经存在的数百万行代码.无论如何,这将是与旧代码的混合语法。 “函数名在视觉上始终在同一个地方,支持快速扫描代码。”我使用我的IDE生成的大纲,扫描速度更快。 “结果类型同上,易于视觉识别。” 为什么在auto main() -&gt; int 中找出返回类型比在int main() 中更容易找到返回类型,我不知道不需要通读任何东西就能找到它?
    • @Ali: re "为什么在 auto main() -> int 中找出返回类型比在 int main() 中更容易找到返回类型,我不知道必须通读任何东西才能找到它”,当你发现有必要攻击一个稻草人的论点时,你承认没有真正的论点。然而,恐惧和厌恶的感觉是不做某事的正当理由。无论这种感觉多么不合理,它们确实会影响一个人的行为,而不得不与它们作斗争可能会降低工作效率。
    • @Cheersandhth.-Alf “你在攻击” 我没有攻击任何人/任何事。我留下了我不同意的评论并给出了我的理由。你仍然没有给我任何理由为什么在auto main() -&gt; int 中找到返回类型比在int main() 中更容易。
    • @Ali:我认为auto main() -&gt; int 没有任何问题。
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2015-08-28
    • 2011-06-05
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多