如何始终正确初始化?

时间:2014-01-23 20:49:33

标签: c++ c++11 initialization value-initialization aggregate-initialization

使用C ++ 11,已经引入了统一初始化,我得到的印象是{}现在对所有情况都是非常安全initialization(如果允许的话)。但我just noticed,我错了。

什么 是所有类型的安全初始化形式?具有已删除/私有默认c'tor或课程的Baring类。

某些类型

的详细信息

以下是内置

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-arrays

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 个答案:

没有答案
相关问题