为什么我不能为 std::vector 数据成员提供类内初始值设定项



我试图在类范围内初始化成员vec,但编译器抛出了一个更隐蔽的错误。

class A {
public:
static const size_t sz = 10;
static const std::vector<double> vec{ sz }; // error
};

编译器(gcc(给出以下错误:

error: in-class initialization of static data member 'std::vector<double> A::vec' of non-literal type
10 |     static std::vector<double> vec{ sz };
|                                ^~~
error: non-constant in-class initialization invalid for non-inline static member 'A::vec'
10 |     static std::vector<double> vec{ sz };
|                                        ^
note: (an out of class initialization is required)

我该怎么解决这个问题?

通常,静态数据成员可能不会在类主体中初始化。但是,我们可以为仅为const限定的积分类型的静态成员提供类内初始值设定项。如果使用非整数静态成员,并且需要提供类内初始值设定项,则数据成员应为constexpr文字类型。在任何情况下,初始值设定项都必须是常量表达式。如果成员的类型不是文字类型(因此不能使用constexpr(,则静态成员不应具有默认的成员初始值设定项,相反,它可以在类之外定义。

所以你的错误只是因为std::vector<double>是非积分型的。此外,不能将vec声明为constexpr,因为std::vector<double>不是文字类型。

所以要修复上面的例子,你可以这样做:

class A {
public:
static const size_t sz = 10;
static const std::vector<double> vec;
};
const std::vector<double> A::vec{ sz };

(演示(

正如在通信网中指出的,请注意,使vecconst-合格,将丢失一些向量特征。例如,添加任何元素后都不能修改它!

最新更新