gpt4 book ai didi

c++ - 未捕获 constexpr 变量

转载 作者:行者123 更新时间:2023-12-03 10:03:49 25 4
gpt4 key购买 nike

以下代码在 clang 中不编译(在 GCC 中编译):

struct A{
int a;
};

auto test(){
constexpr A x{10};
return []{
return x; // <-- here x is A: clang doesn't compile
}();
}
Clang 的错误是无法在未指定捕获默认值的 lambda 中隐式捕获变量“x”,但我认为始终捕获 constexpr 变量。
如果 x 是 int,则代码编译:
auto test(){
constexpr int x{10};
return []{
return x; // <-- here x is int: clang is ok
}();
}
有趣的是,下面的代码也可以编译:
auto test(){
constexpr A x{10};
return []{
return x.a;
}();
}
叮当是对的吗?如果是这样,理由是什么?
我正在使用 -std=c++17
- 编辑 -
以下问题:
Can I use a constexpr value in a lambda without capturing it?
与这个无关,因为与 clang11 一样,它不再是一个问题:事实上,如上所述,如果 x 是一个 int,clang11 编译。
https://godbolt.org/z/rxcYjz 中也有示例代码

最佳答案

当你return x;在第一个示例中,您必须调用 A的复制构造函数,其中涉及绑定(bind) 引用 x因此 odr-使用它。可以说,可用于常量表达式的值的简单拷贝不应构成 odr-use 任何超过 return x.a; ,但该规则中没有这样的异常(exception),所以 Clang 是 正确 拒绝它。
实际上,您当然可以制作任何 constexpr变量 static 以避免任何需要捕获它。

关于c++ - 未捕获 constexpr 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65226057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com