我在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
是::I
,A::x
声明了一个初始化为-7的变量。将CCD_ 11和CCD_ 12互换可给出两个自洽解释,而不是一个也没有。
有一条规则是,类不得更改其定义中执行的任何名称查找的含义,但尚不清楚它是否适用于此处,因为在变量解释下,查找不会更改。相反,句法可能性被完全排除在外,尽管在某些情况下它是完全明确的。