【发布时间】:2020-05-02 19:33:17
【问题描述】:
C++20 是否允许将衰减为函数指针的非捕获 lambda 作为非类型模板参数直接传递?如果是这样,正确的语法是什么?
我使用-std=c++2a在各种版本的clang和gcc中尝试了以下代码。
#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);
}
gcc 无怨无悔地编译代码,代码按预期运行。
clang 编译失败并出现以下错误:
error: a lambda expression cannot appear in this context
using X = S<+[](int x) -> void { std::cout << x << " hello\n"; }>;
^
这是完整的代码(在线版本):
Clang 10.0.0 HEAD:https://wandbox.org/permlink/n5eKQ4kQqSpDpr4k
Gcc 10.0.0 HEAD 20200113:https://wandbox.org/permlink/vJ44sdMtwCKAFU64
【问题讨论】:
-
有什么进展吗?最新的苹果叮当声仍然是同样的抱怨。
标签: c++ templates lambda c++20