小编Mas*_*nes的帖子

我可以使用C++ 17 captureless lambda constexpr转换运算符的结果作为函数指针模板非类型参数吗?

在回答时如何编写看起来像方法的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)

问题是,谁是对的?

c++ lambda templates language-lawyer c++17

12
推荐指数
1
解决办法
765
查看次数

标签 统计

c++ ×1

c++17 ×1

lambda ×1

language-lawyer ×1

templates ×1