【问题标题】:A question about c++ grammar [static const auto compare = [](const std::string& now, const std::string& next) noexcept ->bool ]一个关于c++语法的问题 [static const auto compare = [](const std::string& now, const std::string& next) noexcept ->bool ]
【发布时间】:2020-02-21 12:35:23
【问题描述】:
static const auto compare = [](const std::string& now, const std::string& next) noexcept ->bool 
    {
        return now.size() == next.size() ? now < next : now.size() < next.size();
    };

我在 Hacker 等级上看到了这段代码,但我不明白它是如何工作的。

第一季度。为什么这个人使用 static const auto 和 const std::string Q2。这是什么意思 ? Q3。为什么是字符串&?不是字符串 Q4。 noexcept -> bool 是什么意思?

任何 cmets 将不胜感激!

【问题讨论】:

标签: c++ static constants grammar noexcept


【解决方案1】:

我不确定是否应该使用有关 lambda 语法的通用副本来回答或关闭,但是这里发生了很多事情,我很想一步一步地解释它。

首先,我建议获取a good book for learning C++(尤其是涵盖 C++11 的),而不是 HackerRank 或任何其他“竞争性编程”网站。在那里编写的代码很少能被称为“好”,其他人提供的解决方案(如您所见)通常只是为了展示自己的知识,而不是与他人分享。

你看到的是一个lambda expression。它定义了一个名为compare 的lambda,它接受两个const std::string&amp; 作为参数并返回bool。稍后可能会在 &lt;algorithm&gt; 库的函数中使用它。简单来说,lambda 是函数的简短语法,稍后可以在其他地方调用。

Lambda 语法如下:

[ capture-list ] ( parameters ) optional-qualifiers -> return-type { body } 

你的 lambda 有:

  • 空捕获列表(它只对每次调用提供的参数进行操作)
  • const std::string&amp; 类型的两个参数,每次调用 lambda 时都会传递。
  • noexcept 限定符 - 程序员承诺此 lambda 不会引发异常
  • 返回类型bool
  • 单行正文return now.size() == next.size() ? now &lt; next : now.size() &lt; next.size();

关于变量compare,有几个关键字来定义它:

  • static 强烈依赖于上下文 - 这意味着在类范围和命名空间范围内有所不同。 Read more in this question
  • const 很明显——这个变量不会改变。需要在适当的位置初始化 static 类成员。
  • auto - 让编译器推断变量的类型。 Lambda 没有任何通用的类型名称,因此 autostd::function&lt;&gt; 只是可以使用的选项。

最后:

第三季度。为什么是字符串&?不是字符串

为什么不呢?绝对没有理由将参数复制到 lambda 中,因此通过引用传递它们要快得多。有关该主题的更多信息:What's the difference between passing by reference vs. passing by value?

【讨论】:

    【解决方案2】:

    这叫Lambda Expression

    这里使用的语法是

    [ 捕获 ] ( 参数 ) -> ret { body }

    您可以将 lambda 视为C++ 中的任意变量

    第一季度。为什么这家伙使用 static const auto 和 const std::string?

    A1。 static const autostatic const auto x = 1;const std::string 的含义相同,以防止修改 lambda 主体内的参数。

    第二季度。 [] 是什么意思?

    A2。这是 lambda 捕获的语法,您可以指定 lambda 正文中可见的内容。

    第三季度。为什么是字符串&?

    A3。通过引用传递std::string 以避免复制。

    第四季度。 noexcept -> bool 是什么意思?

    A4。 noexcept 告诉编译器代码不会抛出异常。 -&gt; bool 是 lambda 的返回码。

    【讨论】:

      【解决方案3】:

      第一季度。为什么这家伙使用 static const auto 和 const std::string

      为什么不呢?我不是作者,所以无法准确回答。没有上下文,我什至无法做出合理的猜测。

      第二季度。 [] 是什么意思?

      它是 lambda 表达式语法的一部分。这是捕获列表,它是空的。

      第三季度。为什么是字符串&?不是字符串

      大概是因为复制字符串可能很慢。

      第四季度。 noexcept -> bool 是什么意思?

      noexcept 表示该函数不允许抛出。 -> bool 是函数的返回类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-26
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多