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.交换 ::I
和 A::I
给出 两个 自洽解释而不是 none.
有一条规则,class 不得更改在其定义中执行的任何名称查找的含义,但不清楚它是否适用于此处,因为在变量解释下查找不会更改。相反,句法可能性被完全排除,即使在某些情况下它是完全明确的。
我在 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.交换 ::I
和 A::I
给出 两个 自洽解释而不是 none.
有一条规则,class 不得更改在其定义中执行的任何名称查找的含义,但不清楚它是否适用于此处,因为在变量解释下查找不会更改。相反,句法可能性被完全排除,即使在某些情况下它是完全明确的。