如果以前已经讨论过这个问题,我不会感到惊讶,但是我不知道寻找答案的神奇搜索词是什么。
为什么要编译
int main() {
int* p(new int());
return 0;
}
虽然不是,
class X {
int* p(new int());
};
还可以吗?
class X {
int* p = new int();
};
答案 0 :(得分:1)
这是最令人烦恼的解析。
在第二种情况下,我相信p
被解析为一个函数(但是我不确定)。无论如何,它都不会被解析为指向用值int
初始化的new int()
的指针。用大括号替换括号可解决此问题。
尽管我找到了问题的根源,但如果有人能告诉我解析器如何准确解释问题的第二个示例,我将不胜感激。我仍然不完全了解发生了什么。
答案 1 :(得分:1)
您要使用的“类内”初始化是C ++ 11功能,需要使用=
或{}
初始化程序语法
class X {
int* p = new int();
};
或
class X {
int* p{ new int() };
};
首先,C ++ 11围绕{}
初始化程序特别强调统一初始化语法。其次,在这种情况下,()
语法可能会在类成员函数声明语法中造成不必要的歧义。