После чтения этого недавнего вопроса от @Mehrdad, на котором классы должны быть сделаны не подвижными и, следовательно, не скопируемыми, я начинаю задаваться вопросом если есть варианты использования для класса, который может быть скопирован, но не перемещен. Технически это возможно:
struct S
{
S() { }
S(S const& s) { }
S(S&&) = delete;
};
S foo()
{
S s1;
S s2(s1); // OK (copyable)
return s1; // ERROR! (non-movable)
}
Хотя S
имеет конструктор копирования, он, очевидно, не моделирует концепцию CopyConstructible
, потому что это, в свою очередь, уточнение концепции MoveConstructible
, которая требует наличия (не удаленного) конструктора перемещения (см. § 17.6.3.1.2, таблица 21).
Существует ли какой-либо прецедент для типа типа S
, который является , но не CopyConstructible
и не движется? Если нет, почему не запрещено объявлять конструктор копирования и конструктор удаленных перемещений в том же классе?