c++ - 我可以将 C++17 无捕获 lambda constexpr 转换运算符的结果用作函数指针模板非类型参数吗?

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

在回答 How do I write a lambda expression that looks like a method? 时,我试图通过利用以下事实将无捕获 lambda 转换为成员函数指针,即自 C++17 以来,无捕获 lambda 有一个 constexpr 转换运算符到其函数指针类型。

所以我想出了一个归结为:

template<void(*)()> struct A{};

int main()
{
  A<static_cast<void(*)()>([]{})>{}; // 1

  constexpr auto fp = static_cast<void(*)()>([]{});
  A<fp>{}; // 2
}

现在,它在 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

问题是,谁是对的?

最佳答案

这是一个 gcc 错误,已归档 83258 .

在 C++14 中,我们曾经有一个 linkage requirement对于指针类型的非类型模板参数。但是在 C++17 中(由于 N4268 ),参数只需要是 converted constant expression类型正确,但有一些其他限制(此处均不相关)。一旦我们可以构造 fp,我们应该能够将它用作模板参数。

关于c++ - 我可以将 C++17 无捕获 lambda constexpr 转换运算符的结果用作函数指针模板非类型参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47606810/

相关文章:

c++ - std::basic_string 构造函数如何预先知道要保留多少空间?

c++ - 如何从 C++ 生成均匀分布在 0 和 1 之间的随机 double ?

python - Pandas系列应用lambda : NoneType found,,但系列中只有str和list

java - BiFunction - apply 方法应该总是返回第二个参数。为什么?

python - psycopg2 aws lambda超时错误

c++ - 64 位整数句柄类型的简明位操作

c++ - QListView更新-不触发更新

c++ - 使用非类型模板参数转发声明函数模板

c++ - 抽象/重构此开关/案例的好方法是什么?

C++11 从初始化列表到数组参数的隐式转换