构造具有私有成员的对象

constexpr to construct objects with private members

本文关键字:对象 成员      更新时间:2023-10-16

我有以下代码编译和行为如预期:

struct A
{
    //private:
        int v;
    friend constexpr A f(int v);
};
constexpr A f(int v)
{
    return A{v};
}
constexpr A operator""_A(unsigned long long v)
{
    return f(static_cast<int>(v));
}

我可以像这样构造类型为A的对象:

auto a = 1_A;

如果我使值A::v私有,我得到编译错误

初始化'A'没有匹配的构造函数

如果我将构造函数添加到A,我得到一个不同的编译错误:

Constexpr函数的返回类型'A'不是文字类型

是否有一种方法使A::v私有,仍然有constexpr函数来构造A类型的对象?

如果:

  • 有一个简单的析构函数
  • 它是一个聚合,或者它至少有一个非复制,不可移动的constexpr构造器
  • 它的所有基类和非静态成员都是非易失性文字类型

因此,当向一个类添加一个构造函数时,如果你想要它是一个文字类型,你必须将这个构造函数标记为constexpr