![](/img/trans.png)
[英]Why should I use the extern keyword to declare variables in a namespace scope?
[英]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.