Почему defaults-move-ctor запрещает неявный-copy-ctor, а не defaults-copy-ctor? - PullRequest
0 голосов
/ 22 ноября 2018

Кажется, я столкнулся с примером, в котором конструктор перемещения по умолчанию, кажется, считается как объявленным пользователем, так и объявленным не пользователем, в зависимости от ситуации:

struct Foo {
    int a;
    Foo():a(42){};
    //Foo(const Foo & other) = default;
    Foo(Foo && other) = default;

};

int main() {
    Foo f;
    Foo g = f;
}

приводит к этому:

test.cpp:11:9: error: call to implicitly-deleted copy constructor of 'Foo'
    Foo g = f;
        ^   ~
test.cpp:5:5: note: copy constructor is implicitly deleted because 'Foo' has a user-declared move constructor
    Foo(Foo && other) = default;
    ^

Ожидается ошибка компилятора, поскольку cppreference сообщает нам об этом:

Неявно объявленный или дефолтный конструктор копирования для класса T определяется как удаленный, если выполняется любое из следующих условий:
[...]
T имеет пользовательский конструктор перемещения или оператор присваивания перемещения;

Обратите внимание, что конструктор по умолчанию считается здесь "объявленным пользователем".Однако, если мы теперь удалим комментарии из строки 4, тем самым явным образом по умолчанию установив конструктор копирования, программа скомпилируется без ошибок, даже если в приведенном выше утверждении указано:

Неявно объявленный или по умолчанию копировать конструктор

Это выглядит как противоречие.Это ошибка в cppreference или я просто запутался?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Почему defaults-move-ctor запрещает неявный-copy-ctor, а не defaults-copy-ctor?

Потому что, когда вы определяете конструктор как дефолтный, вы восстанавливаете удалениеЭффект, вызванный конструктором перемещения, установкой по умолчанию конструктора копирования имеет тот же эффект, что и явное определение того, что делает компилятор.

0 голосов
/ 22 ноября 2018

Это похоже на ошибку со стороны cppreference.Объявление конструктора перемещения / оператора присваивания только удаляет неявно объявленный конструктор копирования.Действительно, объявление конструктора копирования по умолчанию - это объявление пользователем, и, следовательно, это не относится к этому случаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...