在回答时如何编写看起来像方法的lambda表达式?我试图通过利用这样一个事实将无捕获的lambda变成一个成员函数指针,因为C++ 17,无捕获的lambdas有一个constexpr转换操作符到它们的函数指针类型.
所以我提出了一个问题:
template<void(*)()> struct A{};
int main()
{
A<static_cast<void(*)()>([]{})>{}; // 1
constexpr auto fp = static_cast<void(*)()>([]{});
A<fp>{}; // 2
}
Run Code Online (Sandbox Code Playgroud)
现在,这在clang(从5.0.0开始)编译,但gcc(> = 7.2)抱怨:
error: lambda-expression in template-argument
A<static_cast<void(*)()>([]{ /*whatever*/ })>{}; // 1
^
error: 'main()::<lambda()>::_FUN' is not a valid template argument for type 'void (*)()' because 'static constexpr void main()::<lambda()>::_FUN()' has no linkage
A<fp>{}; // 2
Run Code Online (Sandbox Code Playgroud)
问题是,谁是对的?