在类模板中没有默认lambda的可能性

paw*_*l_j 6 c++ templates

我发现无法创建一个工作模板类,其中默认没有任何操作std::function,但是如果我们创建非模板类,则默认值没有问题.默认lambda没有捕获.请参阅:

struct Dump {
    function<void(bool)> f = [](bool) {};
};

int main() {
    Dump a;
    a.f(true);
}
Run Code Online (Sandbox Code Playgroud)

以上示例有效,但参数化时(甚至不使用参数)

template <class T>
struct Dump {
    function<void(bool)> f = [](bool) {};
};


int main() {
    Dump<bool> a;
    a.f(true);
}
Run Code Online (Sandbox Code Playgroud)

在编译期间得到一个错误:

error: conversion from 'Dump<bool>::__lambda0' to non-scalar type 'std::function<void(bool)>' requested
note: synthesized method 'constexpr Dump<bool>::Dump()' first required here 
Run Code Online (Sandbox Code Playgroud)

Max*_*hof 2

旧版本的编译器(接近 C++ 11 引入这些功能的时间)似乎在编译此代码时存在一些问题,但它们看起来像是编译器错误。您可以在这里使用不同的编译器版本。

  • clang自版本以来代码没有任何问题3.4.1(大约在 C++ 11 成为主流的时候)。

  • gcc4.7.1给出您在版本中显示的错误4.9.0,将其编译到4.9.14.9.4得到一个内部编译器错误(!)5.1,并且显然之后没有问题。

  • icc版本13.0.1完全拒绝初始化器,16.0.1后来就没有问题了。

  • MSVC只有两个版本可用,从 2015 版本开始,但语法没有问题。

因此,您的解决方案是避免std::function使用 lambda 进行默认初始化,或者简单地使用更新的编译器。从长远来看,后者可能会为您减轻很多痛苦。