关于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 是什么意思?
如有任何意见,我们将不胜感激!
这里使用的语法是
[ captures ] ( params ) -> ret { body }
您可以将 lambda 视为 C++
中的任意变量
Q1。为什么这家伙用 static const auto 和 const std::string?
A1。 static const auto
与 static 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 没有任何通用的类型名称,因此 auto
或 std::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 类型。
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 是什么意思?
如有任何意见,我们将不胜感激!
这里使用的语法是
[ captures ] ( params ) -> ret { body }
您可以将 lambda 视为 C++
Q1。为什么这家伙用 static const auto 和 const std::string?
A1。 static const auto
与 static 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 questionconst
很明显——这个变量不会改变。需要初始化static
class 个成员。auto
- 让编译器推断变量的类型。 Lambda 没有任何通用的类型名称,因此auto
或std::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 类型。