【发布时间】:2019-08-28 09:57:54
【问题描述】:
我遇到了这个古玩,不明白为什么使用显式构造函数会导致失败。
我尝试使用 lambda 从配置数据生成和初始化对象。我发现如果对象的类定义不使用显式构造函数,lambda 只能返回对象的副本。此代码示例是我发现的一个简单示例。
class foo {
public:
explicit foo() : _a(0) {}
explicit foo(int val): _a(val) {}
explicit foo(const foo& o) : _a(o._a) {}
explicit foo(foo&& o) : _a(std::move(o._a)) {}
foo& operator()(const foo& rhs) { if (this != &rhs) { _a = rhs._a; } return *this; }
foo& operator()(foo&& rhs) { _a = std::move(rhs._a); return *this; }
int a() const { return _a; }
void a(int val) { _a = val; }
private:
int _a;
};
auto makeFoo = [](int val) -> foo { return foo(val); };
示例代码编译失败,makeFoo 行出现以下错误:
In static member function ‘static foo<lambda(int)>::_FUN(int)’:
error: no matching function for call to ‘foo::foo(foo)’
但是,如果我从 foo 构造函数中删除“显式”标签,则代码编译得很好。
有人能告诉我为什么构造函数不能在这个 lambda 中显式吗?
【问题讨论】:
-
很确定你也会有同样的错误,如果不使用 lambda,使用
normal函数 -
是的,我刚刚查过了。它与 lambda 无关。这都是关于如何分配返回值的。
标签: c++ lambda factory explicit