Я наткнулся на это любопытство и не понимаю, почему использование явных конструкторов может привести к сбою.
Я пытался генерировать и инициализировать объекты из данных конфигурации, используя лямбда-выражения. Я обнаружил, что лямбда-выражение может возвращать копию объекта только в том случае, если в определении класса объекта не используются явные конструкторы. Этот пример кода является упрощенным примером того, что я нашел.
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, код скомпилируется просто отлично.
Может ли кто-нибудь просветить меня, почему конструкторы не могут быть явными в этой лямбде?
normal
- person Gian Paolo   schedule 06.04.2019