Удаленный конструктор по умолчанию. Объекты все еще могут быть созданы ... иногда

Наивный, оптимистичный и, о-о ... неправильный взгляд на унифицированный синтаксис инициализации c ++ 11

Я думал, что, поскольку 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, член данных T
struct 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)`

Ответы на вопрос(0)

Ваш ответ на вопрос