【问题标题】:Inline lambdas in header files头文件中的内联 lambda
【发布时间】:2019-08-27 14:45:34
【问题描述】:

这与我见过的其他问题类似,但鉴于 C++17 引入了内联变量,值得一问。考虑这种模式:

auto to_ref = [](auto const& ptr) -> decltype(auto) { return *ptr; }

std::vector<std::unique_ptr<Foo>> foo_ptrs = from_somewhere();
for (Foo const& foo : foo_ptrs | transform(to_ref)) {
}

to_ref 通用 lambda 是...嗯,通用...所以将它放在标题中是有意义的,这样人们就不会到处复制它。

我的问题:模板的链接注意事项是否也适用于通用 lambda?换句话说,编译器/链接器有责任确保对于具有相同模板参数的给定模板的多个实例化不会违反 ODR。我可以依赖相同的行为,还是应该在 auto to_ref = ...; 规范之前添加 inline 说明符?

【问题讨论】:

标签: c++ lambda one-definition-rule


【解决方案1】:

to_ref 是一个带有模板operator() 的对象,它不是任何类型的模板。

您需要将其标记为 inline 以遵守 ODR。

【讨论】:

  • 类型不会不同,因为它是一个 lambda。
  • @Jarod42 如果不是inline,无论哪种方式都没有关系。否则dcl.inline 意味着只有一个对象。 “内联函数或变量应在使用 odr 的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义”
  • 但在这种情况下,您的定义是 [](auto const&amp; ptr) -&gt; decltype(auto) { return *ptr; },它在每次评估时都应该是唯一的类型,这意味着变量的定义在每个 TU 中都会有所不同。
  • @NathanOliver 它应该是独一无二的,但为什么每个 TU 都应该不同,这是什么规则暗示的?
  • @NathanOliver 这对basic.def.odr 来说没问题-“D 的每个定义都应包含相同的令牌序列”。之后的要求归结为那些令牌意味着同样的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多