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

C++ static data member initialization error in Eigen

我在 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

这是为什么?

正如在 paper that added the feature 中讨论的那样,希望默认成员初始化器支持 正向查找 以与(构造函数的)成员初始化器保持一致。但是,成员函数参数列表是不是这样一个完整的-class上下文。这导致函数和变量声明之间的歧义:

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

如果 A::x 是一个变量,那么查找 I 会找到类型 A::I,这意味着 x 的声明可以解释为函数声明(接受一个函数指针),所以它是一个函数。如果它是一个函数,查找 I 不考虑(后续的)A::I,所以 I::I 并且 A::x 声明一个变量初始化为 - 7.交换 ::IA::I 给出 两个 自洽解释而不是 none.

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