繁体   English   中英

我应该内联命名空间 scope lambdas 吗? 无论哪种情况,为什么?

[英]Should I inline namespace scope lambdas? In either case, why?

有时我在 header 文件的顶部定义了一些无捕获的 lambda,该文件用于 header 的以下部分:

//#include statements
namespace detail {
auto constexpr lambda = [](/* args */){ /* body */ };
}
// in some function or whatever, use `lambda`

在代码审查期间,我经常被告知我不仅应该像我一样放置constexpr说明符,还应该放入inline说明符。

我为什么要那么做? 有什么优势?

我已经尝试在 cppreference 上阅读inline说明符,但我认为目前我缺乏很多术语来理解它。

如果变量在 header 文件中定义,则应该使用inline 如果它不是内联的,那么每个包含 header 文件的翻译单元都将获得该定义。 这意味着您对单个名称有多个定义,这违反了 ODR(一个定义规则)。 这些不需要任何诊断,因此它们可能导致难以发现错误。

通过使变量内联,您可以通过告诉编译器/链接器它可以丢弃所有重复的定义而只使用一个来解决问题。

根据 C++ 17 标准(10.1.5 constexpr 说明符)

1 constexpr 说明符仅适用于变量或变量模板的定义或 function 或 function 模板的声明。 使用 constexpr 说明符声明的 function 或 static 数据成员隐式是内联 function 或变量 (10.1.6) 如果 function 或 function 模板的任何声明具有 constexpr 说明符,则其所有声明都应包含 constexpr 说明符。

在您问题的代码片段中,变量lambda不是 static 数据成员。

namespace detail {
auto constexpr lambda = [](/* args */){ /* body */ };
}

因此,如果命名空间detail具有外部链接,那么变量lambda也具有外部链接。 在这种情况下,如果 header 将包含在几个编译单元中,则将破坏一个定义规则。 为避免这种情况,您应该将该变量声明为内联变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM