在回答 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/