相关疑难解决方法(0)

GCC和Clang不同意C++ 17 constexpr lambda捕获

考虑这个将变量声明为constexpr的示例,通过lambda中的副本捕获它,并声明另一个constexpr变量,该变量是constexpr函数从原始变量展开非类型模板参数的结果.

#include <utility>

template<int I>
constexpr auto unwrap(std::integral_constant<int, I>) {
  return I;
}

int main() {
  constexpr auto i = std::integral_constant<int, 42>{};
  constexpr auto l = [i]() {
    constexpr int x = unwrap(i);
  };
}
Run Code Online (Sandbox Code Playgroud)

Clang(trunk)接受此代码.(wandbox)

GCC(主干)失败,出现以下错误消息(wandbox):

lambda_capture.cpp:11:31: error: the value of ‘i’ is not usable in a constant expression
     constexpr int x = unwrap(i);
                               ^
lambda_capture.cpp:10:28: note: ‘i’ was not declared ‘constexpr’
   constexpr auto l = [i]() {
Run Code Online (Sandbox Code Playgroud)

哪个编译器正确?在我看来,这是一个GCC错误,其中lambda捕获的constexpr-ness没有正确传播到lambda上下文.

c++ lambda c++17

19
推荐指数
1
解决办法
1153
查看次数

标签 统计

c++ ×1

c++17 ×1

lambda ×1