【问题标题】:Template member default initialization模板成员默认初始化
【发布时间】:2012-08-29 07:53:21
【问题描述】:

假设我有以下模板

template <typename T>
class{
   T t;
};

现在,我想添加一个构造函数,用它的类型的默认值初始化 t。也就是说,对于数值类型,t应该用0初始化,对于指针,t应该用nullptr初始化。最后,可能还有其他类型,例如结构。在这里,一个好的初始化将是默认构造函数(无论如何都会调用它,所以我不必在这里做任何事情)。

总之,我正在寻找这样的东西:

template<typename T>
class X{
    T t;
    X() : t(default_value<T>::value);
}

正如我想象的语法所指出的,我认为可以使用具有不同专业化的某种模板来承载默认值。但是如何处理结构和类呢?由于我已经指定了t(...),所以默认构造函数不再是一个选项。

【问题讨论】:

    标签: c++ templates initialization default-value


    【解决方案1】:

    你可以这样做

    X() : t() { }
    

    和/或 C++11 中的这个

    X() : t { } { } // see Johannes Schaub's comments about this
    

    这会将值初始化(或者它是默认初始化?)t 为其类型的默认值,无论是内置的 0,数组的一系列(值?默认)初始化,还是使用用户定义类型的默认构造函数。

    【讨论】:

    • 如果您想要进行特定的初始化(在这种情况下您想要值初始化),使用 {} 不是一个好主意。例如,现在使用 {} 如果 T 是引用类型,您会默默地拥有未定义的行为。
    • @JohannesSchaub-litb 啊好的,谢谢,我不知道。
    • is X() : t() {} 如果没有显式定义,则与编译器隐式定义的默认构造函数相同?
    猜你喜欢
    • 2019-09-10
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多