есть) вот такой базовый класс:
class Component {
public:
Component() = default;
virtual ~Component() = default;
//…
Component(const Component& other) = delete;
Component(Component&& other) noexcept = default;
Component& operator=(const Component& other) = delete;
Component& operator=(Component&& other) noexcept = default;
};
вопрос: почему из его наследников нельзя создать std::tuple?
class Foo : public Component {
public:
Foo() { }
~Foo() { }
};
std::tuple foo{Component{}}; // ERROR - no matching constructor
Мув-конструктор у Foo удалён, также как и копи. Явно пропиши Foo(Foo&&) = default;
спасибо! Да, так работает (можно даже снять изначально заданный noexcept, кстати), но тогда вопрос - а почему? получается, так или иначе, от явного прописывания rule 5 не избавиться? Хотелось бы ничего не указывать явно, конечно
Убери деструктор - будет хорошо
интересно, в годболте на gcc ошибку не выдает
у меня apple clang, но подозреваю что и с неэппловским воспроизведется. Кстати да, дико извиняюсь что изначально на годболт не закинул, я что-то думал что слишком простой код, чтобы кто-то захотел его компилировать =)
может я не так ваш код скопировал? 😆 https://godbolt.org/z/z5hMPfo3b
наследника? std::tuple foo{Component{}}; может тут должно быть Foo а не Component?
Да, конечно, опечатался. С базовым классом работает и так.
Обсуждают сегодня