Как всегда правильно инициализировать?

С С ++ 11 Единая инициализация был введен, и у меня сложилось впечатление, что {} сейчас вполне безопасно инициализация для всех случаев (когда это разрешено). Но я только что заметил, что я ошибаюсь.

Какие является безопасная форма инициализации для всех типов? Baring классы с удаленным / частным c’or или курсом по умолчанию.

Детали для некоторых типов

Вот встроенный:

int u;          // evil, x will be un-initialized
int v{};        // nice value-initialization, as far as I know.
int w={};       // nice value-initialization, right?
int x={0};      // proper initialization, not suited for other types though
int x=0;        // proper initialization, also not suited

Но с совокупный лайк tm

#include <ctime>
tm birth1{};    // evil. nothing initialized.
tm birth4=tm(); // yes! nice value-initialization.
tm birth2 ={};  // evil. nothing initialized
tm birth3 ={0}; // evil, only first member init

но с C-массивы

int data1[9] ={};  // evil. nothing initialized.
int data1[9] ={0}; // proper (value?)-initialization of all elements

И что с классы за пределами агрегатов с созданным компилятором default-c’tor?

struct Widget {
std::string name;
int val;
};
Widget w1;    // w1.val will be uninitialized
Widget w2{};  // w2.val will be uninitialized
Widget w3 = Widget{}; // ??? will w3.val be value-initialized?
Widget w4{0}; // an error, or course.

Я забыл важный вид?

Шаблон, который работает для всех?

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

template<typename T>
T init() {
return T{};
// or 'T t = T{}; return t;'
// or...
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …