头文件中的内联Lambda

Kyl*_*fel 2 c++ lambda one-definition-rule

这与我所见过的其他问题类似,但是考虑到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)) {
}
Run Code Online (Sandbox Code Playgroud)

to_ref通用拉姆达是......嗯,通用...所以是有意义的把它放在一个头这样的人不是到处复制它。

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

Cal*_*eth 5

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

您需要对其进行标记inline以遵守ODR。