我发现不能创建一个工作模板类,其中有一个默认的无所事事的std::function
,但是如果我们创建非模板类,就没有问题使用默认值。默认 lambda 没有捕获。请参阅:
struct Dump {
function<void(bool)> f = [](bool) {};
};
int main() {
Dump a;
a.f(true);
}
上面的例子是可行的,但是当参数化时(甚至不使用参数)
template <class T>
struct Dump {
function<void(bool)> f = [](bool) {};
};
int main() {
Dump<bool> a;
a.f(true);
}
编译时出现错误:
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
最佳答案
似乎旧版本的编译器(接近 C++ 11 引入这些功能的时间)在编译此代码时存在一些问题,但它们看起来像是编译器错误。您可以使用不同的编译器版本 here .
clang
自版本3.4.1
以来的代码没有问题(大约在 C++ 11 成为现实的时候)。gcc
给出了您在4.7.1
到4.9.0
版本中显示的错误,在中编译它就好了>4.9.1
到4.9.4
,在5.1
中出现内部编译器错误 (!),之后显然没有问题。icc
版本13.0.1
完全拒绝初始化程序,16.0.1
及更高版本没有问题。MSVC
只有两个版本可用,从 2015 版开始,但使用语法没有问题。
因此,您的解决方案是避免使用 lambda 对 std::function
进行默认初始化,或者简单地使用更新的编译器。从长远来看,后者可能会为您省去很多痛苦。
关于c++ - 类模板中不可能有默认的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51727230/