2015-04-26 1 views
4

Я думал, что когда я удалю конструктор перемещения в B, следующий код все равно будет компилироваться, так как он должен все же взять конструктор копирования для построения объектов B. Почему компилятор теперь жалуется. Без =delete это не так и называется конструктор копирования в любом случае, так как это не было разрешено предоставлять конструктор перемещения по умолчанию!)Отказ от копирования конструктора не работает?

class B{ 
    public: 
    B(){} 
    ~B(){} 
    B & operator=(const B & b){ 
     std::cout << " cannot move -> copy " << std::endl; 
     return *this; 
    } 
    B(const B & v){ 
     std::cout << " cannot move -> copy " << std::endl;   
    } 

    // B(B && b) = delete; // uncomment this! 
}; 


int main() 
{ 
    B b(B{}); 
} 

Compiler Output с лязгом 3,6 (Live code)

main.cpp:27:7: error: call to deleted constructor of 'B' 

    B b(B{}); 

    ^~~~ 

main.cpp:21:5: note: 'B' has been explicitly marked deleted here 

    B(B && b) = delete; 

    ^

1 error generated. 
+4

«Функция не определена» и «функция определена как удаленная» - это не одно и то же. Последнее означает, что функция участвует в разрешении перегрузки нормально, тогда возникает ошибка, если она действительно выбрана. –

+0

ah ups, thanks :-) – Gabriel

ответ

1

функция с все еще объявлено удаленное определение. Помимо всего прочего, участвует в разрешении перегрузки обычно - но если разрешение перегрузки на самом деле выбирает его, программа плохо формируется ([dcl.fct.def.delete]/2):

Программа который ссылается на удаленную функцию неявно или явно, кроме как объявить ее, плохо сформирован. [Примечание: Это включает вызов функции неявно или явно и формирование указателя или указателя на элемент . Он применяется даже для ссылок в выражениях, которые потенциально не оцениваются. Если функция перегружена, на нее ссылаются, только если функция выбрана с помощью разрешения перегрузки. -end примечание]

Это отличается от функции, которая никогда не была объявлена ​​на всех. Декларация, которая не существует, конечно, не участвует в разрешении перегрузки.

+3

Есть одно исключение: конструктор * по умолчанию * move или оператор перемещения, который определен как удаленный, игнорируется при разрешении перегрузки. –

Смежные вопросы