Рассмотрим следующий пример:
#include <iostream>
#include <string>
#include <utility>
template <typename Base> struct Foo : public Base {
using Base::Base;
};
struct Bar {
Bar(const Bar&) { }
Bar(Bar&&) = delete;
};
int main() {
std::cout << std::is_move_constructible<Bar>::value << std::endl; // NO
std::cout << std::is_move_constructible<Foo<Bar>>::value << std::endl; // YES. Why?!
}
Почему компилятор генерирует конструктор перемещения, несмотря на то, что базовый класс невозможен?
Это в стандарте или это ошибка компилятора? Возможно ли "прекрасно размножать" перемещение от базового до производного?