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

Give an aggregate a converting constructor?

我正在编写一个由多个 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?
}

This is because property 1 requires the type to be an aggregate, which means it must have no constructors

不,它可以有空的构造函数

class uint128_t{
public:
    // this is an empty constructor, it does not initializes data
    uint128_t() {}; 
    // calling this ctor will create an object with an initial value "val"
    uint128_t(uint64_t val)
        :data{0, val} {}
    // for larger numbers
    uint128_t(std::string_view src) {
        // implement it yourself
    }
private:
    std::array<uint64_t, 2> data;
};

uint128_t() {} 等构造函数默认会使您的数组保持未初始化状态。使成员未初始化的能力与聚合无关。

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