constexpr用私有成员构造对象

时间:2015-10-05 09:53:05

标签: c++ c++14

我有以下编译和行为符合预期的代码:

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类型的对象?

1 个答案:

答案 0 :(得分:2)

在以下情况下,类是文字类型:

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

因此,在将构造函数添加到要作为文字类型的类时,必须将该构造函数标记为constexpr