Eigen中的C++静态数据成员初始化错误



我在Ubuntu 18.04上使用gcc-10和Eigen 3.3.9。这个代码段编译并运行良好:

struct S {
static inline Eigen::Vector3f u{1, 1, 1};
};
int main() {
Eigen::Vector3f u(1, 1, 1);
}

但是后一个版本的初始化应用于静态数据成员时,无法编译:

struct S {
static inline Eigen::Vector3f u(1, 1, 1);
};

带有此错误消息:error: expected identifier before numeric constant

为什么?

正如添加该功能的论文中所讨论的,为了与(构造函数的(成员初始化器保持一致,默认成员初始化器支持正向查找。然而,成员函数参数列表是而不是这样一个完整的类上下文。这导致函数和变量声明之间的歧义:

int I() {return -7;}
struct A {
int x(I());
typedef int I;
};

如果A::x是一个变量,那么查找I会找到类型A::I,这意味着x的声明可以被解释为函数声明(接受函数指针(,因此它是一个函数。如果它是一个函数,查找I不考虑(后续的(A::I,所以I::IA::x声明了一个初始化为-7的变量。将CCD_ 11和CCD_ 12互换可给出两个自洽解释,而不是一个也没有。

有一条规则是,类不得更改其定义中执行的任何名称查找的含义,但尚不清楚它是否适用于此处,因为在变量解释下,查找不会更改。相反,句法可能性被完全排除在外,尽管在某些情况下它是完全明确的。

最新更新