Tag: 单定义规则

为什么在lambdas中隐式捕获const int(或shorts)?

这编译: int main() { const int x = 123; auto g = []() { std::cout << x << "\n"; }; g(); } 但是这个: int main(){ const float x = 123; auto g = []() { std::cout << x << "\n"; }; g(); } 生产: “错误:'x'未被捕获” 为什么? 我已经在GCC(从5.0.0到8.0.0的各种版本)和Clang(从4.0.0到6.0.0的各种版本)上testing过它。 它在所有情况下performance相同。

在头文件中使用lambda是否违反了ODR?

以下内容可以写在一个头文件中: inline void f () { std::function<void ()> func = [] {}; } 要么 class C { std::function<void ()> func = [] {}; C () {} }; 我猜在每个源文件中,lambda的types可能是不同的,因此在std::function ( target_type的结果将不同)中包含的types。 这是否违反ODR( 一个定义规则 ),尽pipe看起来像一个共同的模式和合理的事情? 第二个示例是否每次都违反了ODR,或者只有至less一个构造函数在头文件中?