2014-11-16 2 views
1

Существуют следующая цитата из N3797::8.4.2/4 [dcl.fct.def.default]:случая, когда предоставленный пользователь явно-дефолт функция определяется как удаленные

функции является пользователем при условии, если пользователь объявленного и явно не дефолт или удален по его первой декларации. Предоставленная пользователем функция с явно дефолтным значением (то есть явно дефолт по умолчанию после ее первого объявления ) определена в том месте, где оно явно по умолчанию; , если такая функция неявно определена как удаленная, программа плохо сформирована.

Я попытался придумать пример, отражающий это правило. Так, стандарт говорит:

Если определение класса не явно объявить конструктор копирования , один объявлен неявно. Если определение класса объявляет конструктор перемещения или оператор переадресации перемещения, неявно объявленный конструктор копирования определяется как удаленный;

следующий код должен выдавать ошибку о вызове удаленной функции:

#include <iostream> 

using namespace std; 

struct A 
{ 
    A(){ } 
    A(const A&&){ cout << "A(const&&)" << endl; } 
    A(const A&) = default; 
}; 

A a; 

A b = a; 

int main() { 
} 

Но она отлично работает. Можете ли вы представить фактический пример, отражающий это?

DEMO

+0

Я думаю, что вы вводите в заблуждение термины * неявные * и * предоставленные пользователем *, если вы объявляете функцию, по определению она не * подразумевается *. Специальная функция может быть необязательно 'default' в первом объявлении, и в этом случае она не * предоставляется пользователем *, но это не делает ее неявной *. – user657267

ответ

0

Мой другой неверный ответ. В вашем случае копировальный конструктор A не предоставляется пользователям, поскольку он явно дефолт по первому объявлению. Пользователь, предоставленные явно-дефолт функция будет выглядеть следующим образом:

struct X 
{ 
    X(); 
}; 

X::X() = default; 

Предложения имеет отношение к, когда конструктор неявно удален в точке, где это дефолт. Возьмем такой пример:

struct X 
{ 
    X(X&&); // user-declared move-constructor, deletes X's copy-constructor 
}; 

struct Y 
{ 
    X x; // data member with deleted copy-constructor deletes Y's 
     // copy-constructor 
    Y(Y const&); 
}; 

// program is ill-formed. Y's copy-constructor was implicitly deleted 
Y::Y(Y const&) = default; 

Поскольку X имеет неявно удален от копирования конструктора, следует, что Y имеет неявно удален от копирования конструктор в силу x является его членом данных. Явно не выполняю конструктор после того, как его объявление плохо сформировано.

+0

Это немного глупо и непоследовательно. Удаление наследования и выполнение 'Derived (Derived &&) {}' вместо этого не приводят к таким ошибкам. Меня поражает как странно. – Rapptz

+0

@Rapptz Я уверен, что есть цитата, относящаяся к этой ситуации (где предоставленный пользователем движок-ctor не удаляет явно установленную по умолчанию копию-ctor в том же классе). Я думаю, что этот пример относится к цитате OP. – 0x499602D2

+0

Действительно, спасибо. Все эти случаи охватываются 12.8/11. –

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