c++ - g++ 和 clang++ 通过引用捕获 `std::integral_constant` 的不同行为
问题描述
给定以下代码
#include <type_traits>
int main ()
{
std::integral_constant<int, 42> ic;
[&]{ constexpr int i = ic; (void)i; }();
}
(这(void)i;
只是为了避免“未使用的变量”警告)clang++ 编译没有问题,其中 g++ 给出以下错误
prog.cc: In lambda function:
prog.cc:7:27: error: '__closure' is not a constant expression
7 | [&]{ constexpr int i = ic; (void)i; }();
| ^~
按价值捕获
[=]{ constexpr int i = ic; (void)i; }();
两个编译器都编译没有问题。
像往常一样,问题是:谁是对的?g++还是clang++?
- 编辑 -
正如 JVApen 所指出的,ic
没有定义constexpr
;那么非 constexpr 变量如何初始化constexpr
变量呢?
无论如何,行为不会改变定义ic
为constexpr
constexpr std::integral_constant<int, 42> ic;
clang++ 编译没有问题;g++ 通过引用给出错误捕获。
- 编辑 -
正如 Jans 所指出的,定义ic
为constexpr
并使用聚合初始化
constexpr std::integral_constant<int, 42> ic{};
两个编译器都编译没有问题。
但是没有constexpr
std::integral_constant<int, 42> ic{};
g++ 给出了通常的错误。
解决方案
推荐阅读
- python - 在 python 中使用 Projected Successive Overrelaxation Solver 实现 Crank Nicolson
- macos - 更新到 zsh 现在终端 bash 配置文件不再显示自定义提示
- .htaccess - 在 .htaccess 中为相同的页面结构重写 URL
- visual-studio-code - 我无法使用 vscode 的 remote-ssh 连接到服务器
- azure - Azure.Security.KeyVault.Secrets 中的 Azure.RequestFailedException
- java - 尝试使用准备好的语句占位符作为聚合函数的参数时出现 JDBC 异常
- reactjs - 反应路线和 navhashlink 问题
- c# - 如何使用搜索图像调整要以任何分辨率读取的图像
- python - 在Python中使用前向和后向填充窗口进行分组和重新采样
- flutter - Flutter Web 允许溢出/双向滚动