关于c++语法的一道题 [static const auto compare = [](const std::string& now, const std::string& next) noexcept ->bool ]

A question about c++ grammar [static const auto compare = [](const std::string& now, const std::string& next) noexcept ->bool ]

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 rank 上看到这段代码,但我不明白它是如何工作的。

Q1。为什么这家伙使用 static const auto 和 const std::string Q2。这是什么意思 ? Q3.为什么字符串&?不是字符串 Q4. noexcept -> bool 是什么意思?

如有任何意见,我们将不胜感激!

这叫做Lambda Expression

这里使用的语法是

[ captures ] ( params ) -> ret { body }

您可以将 lambda 视为 C++

中的任意变量

Q1。为什么这家伙用 static const auto 和 const std::string?

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

Q2。 [] 是什么意思?

A2。这是 lambda 捕获的语法,您可以指定在 lambda 体内可见的内容。

Q3。为什么是 string&?

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

Q4。 noexcept -> bool 是什么意思?

A4。 noexcept 告诉编译器代码不会抛出异常。 -> bool 是 lambda 的 return 代码。

我不确定是否应该用关于 lambda 语法的通用重复项来回答或关闭这个问题,但这里发生了很多事情,我很想逐步解释它。

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

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

Lambda语法如下:

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

您的 lambda 有:

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

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

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

最后:

Q3. Why string&? not string

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

Q1. Why this guy used static const auto and const std::string

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

Q2. What does [] mean ?

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

Q3. Why string&? not string

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

Q4. what does noexcept -> bool mean?

Noexcept表示函数不允许抛出。 -> bool 是函数的 return 类型。