VS2017: конструктор копирования не работает при удалении конструктора перемещения

Рассмотрим следующий фрагмент кода:

#include <iostream>

using namespace std;

struct Snitch {
  Snitch() { cout << "c'tor" << endl; }
  ~Snitch() { cout << "d'tor" << endl; }

  Snitch(const Snitch&) { cout << "copy c'tor" << endl; }

  Snitch& operator=(const Snitch&) {
    cout << "copy assignment" << endl;
    return *this;
  }

  Snitch(Snitch&&) = delete;
  Snitch& operator=(Snitch&&) = delete;
};

Snitch CreateSnitch(bool v) {
    Snitch a, b;
    if (v) {
        return a;
    }
    return b;
}

int main(int argc, char** argv)
{
    Snitch s = CreateSnitch(true);
}

Это тот случай, когда RVO не работает, поэтому при возврате объекта из функции должна вызываться конструкция move. Но так как конструкция перемещения удалена, я предположил, что должен быть вызван конструктор копирования. Вместо этого я получаю следующую ошибку компиляции в вышеупомянутой среде:

Ошибка C2280 "Snitch::Snitch(Snitch &&)": попытка сослаться на удаленную функцию

Кроме того, когда я добавляю const Ключевое слово, чтобы вернуть тип значения и локальные переменные a а также b оно работает. Я предполагаю, что последняя часть компилируется, потому что компилятор "понимает", что нет способа вызвать конструктор перемещения и вызывает конструктор копирования. Итак, я не понимаю, почему исходный код не компилируется.

0 ответов

Другие вопросы по тегам