给一个聚合一个转换构造函数?

Ber*_*ard 2 c++ constructor aggregate-initialization c++20

我正在编写一个由多个 s 组成的大型固定大小整数类型uint64_t,如下面的(简化的)示例所示。我希望我的类型表现得像内置整数类型,这意味着(除其他外):

  1. 如果你不给它赋值,它应该是未初始化的,并且
  2. 它应该接受其他内置整数类型的扩展。

然而,在我看来,人们无法编写一种同时满足这两个属性的类型。这是因为属性 1 要求类型是聚合,这意味着它必须没有构造函数,而我们需要一个构造函数来实现属性 2。

有没有办法编写一个满足这两个属性的大整数类型?

#include <array>
#include <cstdint>

struct uint128_t{
    std::array<uint64_t, 2> data;
};

int main(){
    uint128_t x; // uninitialized (good)
    uint128_t y = 100; // can we make this work while ensuring that the previous line still works?
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 5

默认情况下,诸如此类的构造函数uint128_t() {}将使数组保持未初始化状态。使成员保持未初始化的能力与聚合无关。

但还有一个更好的选择:uint128() = default;。它将导致uint128_t x;未初始化,但uint128_t x{};会被清零,就像内置类型一样。