我想创建一个包装数字类型的类型(并提供附加功能)。
此外,我需要号码和包装纸两者都可以隐式转换对彼此。
到目前为止我有:
template<class T>
struct Wrapper
{
T value;
Wrapper() { }
Wrapper(T const &value) : value(value) { }
// ... operators defined here ...
};
It's almost很好,但事实并非如此quite行为与内置类型相同:
#include <iostream>
int main()
{
unsigned int x1, x2 = unsigned int();
Wrapper<unsigned int> y1, y2 = Wrapper<unsigned int>();
std::cerr << x1 << std::endl; // uninitialized, as expected
std::cerr << y1.value << std::endl; // uninitialized, as expected
std::cerr << x2 << std::endl; // zero-initialized, as expected
std::cerr << y2.value << std::endl; // uninitialized!?!
}
有什么办法让我设计Wrapper
这样的陈述就像
Wrapper<unsigned int> y2 = Wrapper<unsigned int>();
初始化value
里面,but without
更新答案
好吧,正如 dyp 指出的那样,我和其他人都错了。您可以通过以下方式实现您想做的事情= default
使用默认构造函数:
Wrapper() = default ;
^^^^^^^^^
这是有效的,因为如果没有初始化程序,您将获得我之前概述的相同行为,但是当您使用值初始化时,行为会发生变化,如段落中概述的那样8:
— 如果 T 是(可能是 cv 限定的)非联合类类型没有用户提供或删除的默认构造函数,则该对象为零初始化并且,如果 T 有一个非平凡的默认构造函数,则默认初始化;
原答案
我认为没有办法让这项工作按照您想要的方式进行。类类型的行为与内置类型不同,我们可以从标准草案部分看到这一点8.5
初始化器段落12其中说(强调我的前进):
If 没有为对象指定初始化程序,该对象是默认初始化的;如果不执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值。 [ 注意:具有静态或线程存储持续时间的对象是零初始化的,请参见 3.6.2。 ——尾注]
我们可以看到这对类的结果与段落中的内置类型不同7其中说:
默认初始化 T 类型的对象意味着:
并包括以下项目符号:
— 如果 T 是 a(可能是 cv 限定的)类类型(第 9 条),调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化是错误的);
— 如果 T 是数组类型,则每个元素都默认初始化;
— 否则,不执行初始化。
如果我们看一下段落11对于第二种情况Wrapper<unsigned int>()
它说:
其初始值设定项是一组空括号的对象,即 ()、应进行值初始化。
然后回到段落8:
对 T 类型的对象进行值初始化意味着:
— 如果 T 是 a(可能是 cv 限定的)班级类型(第 9 条)没有默认构造函数(12.1)或用户提供或删除的默认构造函数,则该对象是默认初始化的; [...]
所以我们最终会得到同样的行为。
Both 禁卫军 and 阿舍普勒为您提供了工作方式略有不同的选项,但似乎可以实现您想要的行为,只是不使用相同的语法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)