相关疑难解决方法(0)

C++20:非类型模板参数中的非捕获 lambda

C++20 是否允许衰减为函数指针的非捕获 lambda 直接作为非类型模板参数传递?如果是这样,正确的语法是什么?

我已经在各种版本的 clang 和 gcc 中使用-std=c++2a.

#include <iostream>

template<auto f>
struct S {
    static void invoke(int x) { f(x); }
};

using X = S<+[](int x) -> void { std::cout << x << " hello\n"; }>;

int main()
{
    X::invoke(42);
}
Run Code Online (Sandbox Code Playgroud)

gcc 毫无怨言地编译代码,代码按预期运行。

clang 编译失败并出现以下错误:

error: a lambda expression cannot appear in this context
using X = S<+[](int x) -> void { std::cout << x << " hello\n"; }>;
             ^
Run Code Online (Sandbox Code Playgroud)

这是完整的代码(在线版本):

Clang 10.0.0 头:https …

c++ lambda templates c++20

10
推荐指数
1
解决办法
608
查看次数

无捕获的 lambda 是结构类型吗?

C++20 接受的P1907R1引入了结构类型,这是非类型模板参数的有效类型。

GCC 和 Clang 都接受以下 C++2a 代码片段:

template<auto v>
constexpr auto identity_v = v;

constexpr auto l1 = [](){};
constexpr auto l2 = identity_v<l1>; 
Run Code Online (Sandbox Code Playgroud)

暗示无捕获 lambda 的类型是结构类型。

  • 无捕获 lambda 确实满足其类型成为结构类型的要求吗?

c++ lambda templates language-lawyer c++20

7
推荐指数
2
解决办法
183
查看次数

标签 统计

c++ ×2

c++20 ×2

lambda ×2

templates ×2

language-lawyer ×1