内联和constexpr在标头中无捕获lambda有什么区别
What is the difference between inline and constexpr captureless lambda in a header?
如果我在头中声明一个无捕获的lambda,之间的区别是什么
inline auto myLambda = []() { ... };
和
constexpr auto myLambda = []() { ... };
如果我理解正确的话,constexpr
表示内联,默认情况下lambdas是constexpr。所以我甚至不确定我是否需要inline
或constexpr
关键字。
我想通过内联声明myLambda
来避免一个定义规则(ODR)冲突,因为这个变量在多个翻译单元中是可见的。
如果我理解正确,
constexpr
表示内联,默认情况下lambda是constexpr
。
第一部分是真的,但不适用于这种情况。来自[dcl.constexpr]/1:
用
constexpr
或consteval
说明符声明的函数或静态数据成员隐含地是内联函数或变量([dcl.inline])。
在我们的例子中,我们既没有函数也没有静态数据成员,所以它不是隐式内联的。你必须明确地标记它。
第二部分并不完全正确。来自[expr.prim.lambda.colose]/4:
如果相应的lambda表达式的参数声明子句后面跟有
constexpr
或consteval
,或者它满足constexpr函数([dcl.constexpr])的要求,则函数调用运算符或任何给定的运算符模板专用化都是constexpr功能。
默认情况下,调用运算符是constexpr
,但lambda本身不是。对于一个无捕获的lambda基本上是可以的,您仍然可以使用调用运算符-如本节的示例所示:
auto ID = [](auto a) { return a; }; static_assert(ID(3) == 3); // OK
简而言之,如果您在标头中声明这个lambda,那么您肯定需要inline
关键字,而且只使用constexpr
关键字也没有坏处。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- int(c) 和 c-'0' 之间的区别。C++
- 可组合的lambda/std::函数与std::可选
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 函数和非捕获 lambda 之间的区别
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 将函数的引用和 lambda 表达式作为参数传递时有什么区别?
- 这个函数和 lambda 有什么区别?
- 内联和constexpr在标头中无捕获lambda有什么区别
- 函子和lambda在用于构造std::thread时有什么区别
- boost::bind、boost::lambda::bind和boost::phoenix::bind的区别
- 函数模板和lambda表达式的区别