我正在看书C++17 - 完整指南 https://rads.stackoverflow.com/amzn/click/com/396730017X以及第 6.1 节中constexpr
lambda作者举了两个例子:
auto squared1 = [](auto val) constexpr { // example 1. compile-time lambda calls
return val * val;
};
and
constexpr auto squared2 = [](auto val) { // example 2. compile-time initialization
return val * val;
};
并说这两者是不同的示例1在编译时评估并且示例2在编译时初始化。
然后作者发表了以下我不完全理解的言论:
如果(仅) lambda 是constexpr
它可以在编译时使用,但是
如果由 lambda 初始化的(闭包)对象是constexpr
, 这
对象在程序启动时初始化,但 lambda 可能
仍然是只能在运行时使用的 lambda(例如,使用
静态变量)。因此,您可以考虑声明:
constexpr auto squared = [](auto val) constexpr { // example 3
return val * val;
};
上述说法到底是什么意思?
显然,constexpr
关键字出现在初始化语句中squared2
lambda 对象和 lambda 表达式本身实施例3但我不明白这有什么好处示例1 .
问题是,一个auto
- 声明的对象不采用constexpr
'其初始化表达式的性质,仅其类型;和constexpr
is not该类型的一部分。看:
为什么 `auto` 不采用其初始化表达式的常量表达式? https://stackoverflow.com/questions/64500142/why-does-auto-not-adopt-the-constexprness-of-its-initializing-expression
所以,假设我有:
auto five_squared = 25;
值25非常多constexpr
,即它可以在编译时使用。但是 -five_squared
will not在编译时可用。您仍然需要表明它是constexpr
(*).
它本质上与你的 lambda 相同。 lambda 是现场定义的类的实例,具有operator()
。没有什么可以使squared
be a constexpr
变量,如果你自己不做的话。
(*) - Note that because of a special rule in the C++ language, const
integers that are initialized with a constant-expression are automatically constexpr
, so you could just write const auto
and get the constexpr
implicitly. However, this is a tricky special-case to have to remember, so if you want to make a variable constexpr
I recommend being explicit about it. Thanks goes to @cigien for bringing up this point.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)