首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于特征的C++静态数据成员初始化错误

基于特征的C++静态数据成员初始化错误
EN

Stack Overflow用户
提问于 2020-12-07 05:19:04
回答 1查看 122关注 0票数 1

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

代码语言:javascript
复制
struct S {
  static inline Eigen::Vector3f u{1, 1, 1};
};

int main() {
  Eigen::Vector3f u(1, 1, 1);
}

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

代码语言:javascript
复制
struct S {
  static inline Eigen::Vector3f u(1, 1, 1);
};

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

为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-09 06:12:34

正如在增加功能的纸张中讨论的那样,希望默认的成员初始化器支持正向查找,以便与(构造函数的)成员初始化程序保持一致。然而,成员函数参数列表并不是一个完整的类上下文.这导致函数声明和变量声明之间的模糊性:

代码语言:javascript
复制
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的变量。互换的::IA::I给了两种自洽的解释,而不是零。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65176497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档