【问题标题】:How to initialize to zero/NULL in a template如何在模板中初始化为零/NULL
【发布时间】:2016-01-05 09:39:20
【问题描述】:

在编写模板时,我想将变量初始化为数据类型为零或 null 的值。如果我将它设置为 0x00,它会作为任何类型的零/NULL 吗?

例如

这是模板声明

template <class T>
...
T A=0x00;

现在,如果我定义一个类型为 T => std::string 的实例,上述语句将用作 NULL ?

int”和“unsigned int”呢?对于这两个它都充当“0”?

【问题讨论】:

  • T 的默认构造函数会为您处理这些问题。
  • 除非T 没有默认构造函数,也就是说。如果T 是具有默认构造函数的类类型,T A; 将初始化A,但如果T 是整数类型,则根本不会初始化A
  • 您当然假设T 类型有某种零。这通常仅适用于数字类型。 class Color 的零是多少?

标签: c++ variable-initialization


【解决方案1】:

使用Value Initialization:

T A = T(); // before C++11

T A{}; // C++11 and later

值初始化的效果是:

1) 如果 T 是具有至少一个用户提供的任意类型构造函数的类类型,则调用默认构造函数;
(直到 C++11)

1) 如果 T 是一个没有默认构造函数或用户提供或删除的默认构造函数的类类型,则该对象是默认初始化的;
(C++11 起)

2) 如果 T 是没有任何用户提供的构造函数的非联合类类型,则 T 的每个非静态数据成员和基类组件都是值初始化的;
(直到 C++11)

2) 如果 T 是具有既不是用户提供也不是删除的默认构造函数的类类型(也就是说,它可能是具有隐式定义或默认构造函数的类),则该对象为零初始化并且如果它有一个非平凡的默认构造函数,那么它是默认初始化的;
(C++11 起)

3) 如果 T 是数组类型,则数组的每个元素都是值初始化的;

4) 否则,对象被零初始化。

【讨论】:

    【解决方案2】:

    你可以使用

    T t{};
    

    value initialization

    【讨论】:

    • 请注意,这个值初始化的大括号语法仅适用于 C++11。
    • @RemyLebeau: 你需要一个可访问的复制构造函数:-)
    • @RemyLebeau Doesn't it? 即使编译器执行复制省略,我仍然相信复制 ctor 应该是可访问的。
    • @RemyLebeau 虽然您的答案的第 1 项)似乎另有说明...我也尝试使用 -std=c++98 进行编译,但代码仍然无法编译(改为复制 ctor private deleted)。我想知道 cppreference 是否在这里。
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2019-05-27
    相关资源
    最近更新 更多