【发布时间】:2016-07-04 11:23:29
【问题描述】:
为什么这段代码可以用 GCC(4.9 和 5+)编译,但不能用 clang(3.5-3.9)编译?
void test(const int&) { }
int main() {
const int x = 42;
auto f = []{ test(x); };
}
我有一些模糊的想法,认为差异与 ODR(一个定义规则)的使用有关,但我不太了解,无法弄清楚这里发生了什么。
【问题讨论】:
-
有趣的是,如果你将 x 设为静态,clang 会很高兴
-
@RichardHodges 不需要捕获具有静态存储持续时间的变量。
-
是否有人认为必须显式捕获上下文而不是编译器为我们找出它有点愚蠢?
-
@BitTickler 不,显式捕获是一件好事。它可以防止意外捕获循环引用(例如在捕获弱/共享 ptr 时)
-
@BitTickler 这就是捕获默认说明符 = 和 &
标签: c++ c++11 g++ clang++ one-definition-rule