Компилятор поломался :(

Есть такой код в одном из методов шаблонной структры:

            if constexpr (std::is_move_assignable<T>::value) {
                Data[Size] = std::move(value);
            } else {
                Data[Size] = value;
            }

Выдает такую ошибку:

/home/oem/Desktop/uuu/main.cpp:70:28: error: use of deleted function ‘MinimalObj& MinimalObj::operator=(const MinimalObj&)’ 70 | Data[Size] = std::move(value);

Как сделать чтобы он не лез в первый клоз?

Вот откуда запускаю:

struct MinimalObj {
    int id;  // NOLINT(misc-non-private-member-variables-in-classes)

    // Draft check for leaks, double-frees and non-inits.
    // NOLINTNEXTLINE(misc-non-private-member-variables-in-classes)
    std::string data = std::string(500U, 'x');

    explicit MinimalObj(int id_) : id(id_) {}
    MinimalObj(MinimalObj &&) = default;
    MinimalObj &operator=(MinimalObj &&) = default;

    MinimalObj(const MinimalObj &) = delete;
    MinimalObj &operator=(const MinimalObj &) = delete;

    ~MinimalObj() = default;
};

signed main() {
    lab_07::vector<MinimalObj> v;
    MinimalObj a{5};
    v.push_back(a);
    v.pop_back();
    if (v.size() == 4) {}
    if (v.empty()) {}
    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Ваша проблема в слове const - правда, в вопросе этого кода вы не привели -

void push_back(const T & value) {
    if constexpr (std::is_move_assignable<T>::value) {
        Data[Size] = std::move(value);
    } else {
        Data[Size] = value;
    }

Вы не можете перемещать константный объект... Вот так

void push_back(T & value) {

все заработает. А с const, естественно, компилятор недопустимый перемещающий оператор пытается заменить на копирующий.

→ Ссылка