我在Ubuntu 18.04上使用gcc-10和艾根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。
为什么会这样呢?
发布于 2020-12-09 06:12:34
正如在增加功能的纸张中讨论的那样,希望默认的成员初始化器支持正向查找,以便与(构造函数的)成员初始化程序保持一致。然而,成员函数参数列表并不是一个完整的类上下文.这导致函数声明和变量声明之间的模糊性:
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给了两种自洽的解释,而不是零。
有一条规则是,类不能更改其定义中执行的任何名称查找的含义,但不清楚它是否适用于这里,因为在变量解释下查找不会改变。相反,语法的可能性被完全排除了,即使在某些情况下,它是完全明确的。
https://stackoverflow.com/questions/65176497
复制相似问题