Удаленный конструктор по умолчанию. Объекты все еще могут быть созданы ... иногда
Я думал, что, поскольку C ++ 11 объекты пользовательских типов должны быть построены с новым{...}
синтаксис вместо старого(...)
синтаксис (за исключением конструктора, перегруженного дляstd::initializer_list
и аналогичные параметры (например,std::vector
: размер ctor против 1 элемента init_list ctor)).
Преимущества: нет узких неявных преобразований, нет проблем с самым неприятным синтаксическим анализом, согласованность (?). Я не видел проблем, так как думал, что они одинаковы (кроме приведенного примера).
Но это не так.
Сказка о чистом безумии{}
вызывает конструктор по умолчанию
... кроме случаев, когда:
конструктор по умолчанию удаляется идругие конструкторы не определены.Тогда похоже, что это скорее значение инициализирует объект? ... Даже если объект удалил конструктор по умолчанию,{}
может создать объект. Разве это не превосходит всю цель удаленного конструктора?
... кроме случаев, когда:
у объекта есть удаленный конструктор по умолчанию идругой конструктор (ы) определены.Тогда это не сcall to deleted constructor
.
... кроме случаев, когда:
объект имеет удаленный конструктор иникакой другой конструктор не определен ипо крайней мере нестатический член данных.Тогда это терпит неудачу с отсутствующими инициализаторами поля.
Но тогда вы можете использовать{value}
построить объект.
Хорошо, возможно, это то же самое, что и первое исключение (значение init the object)
... кроме случаев, когда:
у класса есть удаленный конструктори по крайней мере один элемент данных в классе инициализирован по умолчанию.Тогда ни{}
ни{value}
может создать объект.
Я уверен, что я пропустил несколько. Ирония в том, что это называетсяединообразный синтаксис инициализации. Я снова говорю:ЕДИНАЯ синтаксис инициализации.
Что это за безумие?
Сценарий АУдаленный конструктор по умолчанию:struct foo {
foo() = delete;
};
// All bellow OK (no errors, no warnings)
foo f = foo{};
foo f = {};
foo f{}; // will use only this from now on.
Сценарий БУдаленный конструктор по умолчанию, другие конструкторы удаленыstruct foo {
foo() = delete;
foo(int) = delete;
};
foo f{}; // OK
Сценарий СУдаленный конструктор по умолчанию, другие конструкторы определеныstruct foo {
foo() = delete;
foo(int) {};
};
foo f{}; // error call to deleted constructor
Сценарий DУдаленный конструктор по умолчанию, другие конструкторы не определены, член данныхstruct foo {
int a;
foo() = delete;
};
foo f{}; // error use of deleted function foo::foo()
foo f{3}; // OK
Сценарий EУдаленный конструктор по умолчанию, удаленный конструктор T, член данных Tstruct foo {
int a;
foo() = delete;
foo(int) = delete;
};
foo f{}; // ERROR: missing initializer
foo f{3}; // OK
Сценарий FУдаленный конструктор по умолчанию, инициализаторы членов класса в классеstruct foo {
int a = 3;
foo() = delete;
};
/* Fa */ foo f{}; // ERROR: use of deleted function `foo::foo()`
/* Fb */ foo f{3}; // ERROR: no matching function to call `foo::foo(init list)`