gpt4 book ai didi

c++ - 如何使用户定义的类型像内置类型一样*完全*地初始化?

转载 作者:可可西里 更新时间:2023-11-01 18:36:55 28 4
gpt4 key购买 nike

我想制作一个包装数字类型的类型(并提供额外的功能)。
此外,我需要数字和包装器可以隐式转换彼此。

到目前为止我有:

template<class T>
struct Wrapper
{
T value;
Wrapper() { }
Wrapper(T const &value) : value(value) { }
// ... operators defined here ...
};

几乎不错,但它完全的行为与内置类型相同:

#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>();

在里面初始化但是没有

这样的强制语句
Wrapper<unsigned int> y1;

也要这样做吗?

换句话说,是否有可能使一个类型在初始化方面与内置类型完全一样?

最佳答案

更新的答案

好吧,正如 dyp 指出的那样,我和其他人都错了。你可以通过 = default 实现你想做的事情使用默认构造函数:

 Wrapper() = default ;
^^^^^^^^^

这是可行的,因为如果没有初始化程序,您将获得我之前概述的相同行为,但是当您使用值初始化时,行为会发生变化,如段落 8 中所述:

— if T is a (possibly cv-qualified) non-union class type without a user-provided or deleted default constructor, then the object is zero-initialized and, if T has a non-trivial default constructor, default-initialized;

原始答案

我认为没有办法让这项工作按您希望的方式进行。类类型的行为与内置类型不同,我们可以从标准草案部分 8.5 中看到这一点Initializers 12 段说(强调我的前进):

If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value. [ Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2. —end note ]

我们可以看到这对于类的结果与段落 7 中的内置类型不同,它说:

To default-initialize an object of type T means:

并包括以下项目符号:

— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);

— if T is an array type, each element is default-initialized;

otherwise, no initialization is performed.

如果我们查看第二种情况的第 11Wrapper<unsigned int>()它说:

An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.

然后回到第 8 段:

To value-initialize an object of type T means:

— if T is a (possibly cv-qualified) class type (Clause 9) with either no default constructor (12.1) or a default constructor that is user-provided or deleted, then the object is default-initialized; [...]

所以我们最终得到了相同的行为。

Praetorianaschepler 都为您提供了工作方式略有不同但似乎可以实现您想要的行为的选项,只是语法不同而已。

关于c++ - 如何使用户定义的类型像内置类型一样*完全*地初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22265255/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com