【问题标题】:Pointer Initialization for Class vs Non-Class Variables [duplicate]类与非类变量的指针初始化[重复]
【发布时间】:2019-06-17 16:06:21
【问题描述】:

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

为什么会编译,

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

虽然没有,

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

但是这样吗?

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

【问题讨论】:

  • "downvotes" - 只有一个 downvote..

标签: c++


【解决方案1】:

这是一个最令人头疼的解析。

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

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

【讨论】:

  • 我认为“最麻烦的解析”在这里不适用。相同的标记 int *p(new int()); 在函数块中很好,并声明一个指针对象,而不是函数,因为 new int() 不可能是参数列表。
  • 这就是我如此困惑的原因。将其称为最令人头疼的解析可能肯定是错误的,但它仍然是一个非常令人头疼的解析。
【解决方案2】:

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

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

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

首先,C++11 更加强调基于{} 初始化器的统一初始化 语法。其次,() 语法在这种情况下可能会与类成员函数声明语法产生不必要的歧义。

【讨论】:

  • 我想知道语言添加背后的论文是否提到不允许括号式初始化器的原因是为了避免类似于最令人烦恼的 Parse。
  • 我对统一初始化语法的问题是我一直在使用以不同方式解释花括号的向量......
  • @aschepler:在这里回答 - stackoverflow.com/a/24837330/187690 - 说这与歧义解析有关,但它更多的是 lookup 歧义,而不是纯粹的 Most Vexing Parse 歧义.
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2011-06-24
相关资源
最近更新 更多