类与非类变量的指针初始化

时间:2019-01-24 00:50:19

标签: c++

如果以前已经讨论过这个问题,我不会感到惊讶,但是我不知道寻找答案的神奇搜索词是什么。

为什么要编译

int main() {
  int* p(new int());
  return 0;
}

虽然不是,

class X {
  int* p(new int());
};

还可以吗?

class X {
  int* p = new int();
};

2 个答案:

答案 0 :(得分:1)

这是最令人烦恼的解析。

在第二种情况下,我相信p被解析为一个函数(但是我不确定)。无论如何,它都不会被解析为指向用值int初始化的new int()的指针。用大括号替换括号可解决此问题。

尽管我找到了问题的根源,但如果有人能告诉我解析器如何准确解释问题的第二个示例,我将不胜感激。我仍然不完全了解发生了什么。

答案 1 :(得分:1)

您要使用的“类内”初始化是C ++ 11功能,需要使用={}初始化程序语法

class X {
  int* p = new int();
};

class X {
  int* p{ new int() };
};

首先,C ++ 11围绕{}初始化程序特别强调统一初始化语法。其次,在这种情况下,()语法可能会在类成员函数声明语法中造成不必要的歧义。