С С ++ 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...
}
Задача ещё не решена.
Других решений пока нет …