【问题标题】:How is this a most vexing parse?这是一个最令人烦恼的解析?
【发布时间】:2015-07-22 21:47:11
【问题描述】:

我正在经历这个article

并且在第 3 项中有一个声明说

// C++98 
rectangle       w( origin(), extents() );       // oops, vexing parse

上面的解析是如何最令人头疼的。如果我做了这样的事情

struct origin
{
};
struct Rectangle
{
    Rectangle(const origin& s)
    {
    }
};

声明

 Rectangle s(origin());    

工作正常,不像令人烦恼的解析。 为什么作者说这是一个令人烦恼的解析。这是错字还是我遗漏了什么?

【问题讨论】:

  • 参见文档的第 1(b) 节,它解释了这些令人烦恼的解析。
  • 你为什么说Rectangle s(origin());不像一个令人烦恼的解析?这是最令人头疼的解析的典型例子。如果不是,您认为最令人头疼的解析是什么?
  • 声明工作正常。尝试使用 s 看看会发生什么。
  • 我知道它类似于一个令人烦恼的解析。但是我的印象是,令人烦恼的解析会导致编译时错误。例如,对于一个类 foo 使用它,如 foo a(); 会在编译时出错,它是一种最令人烦恼的解析形式。所以从我得到的是一个语句可能类似于一个令人烦恼的解析,同时编译时没有任何问题。据我了解,一个令人烦恼的解析是一个可能类似于函数的语句。 <Return type> functionName (parameters..)
  • 之所以称它为vexing,是因为声明不会导致编译时错误。它只会在以后的程序中导致错误如果您使用该函数。

标签: c++ most-vexing-parse


【解决方案1】:

Rectangle s(origin()); 也是一个令人烦恼的解析。它声明了一个函数s,它返回rectangle,并将返回origin的函数作为参数指针。不确定您所说的“工作正常”是什么意思。

rectangle w( origin(), extents() ); 声明一个函数 w 返回 rectangle 并接受参数:指向返回 origin 的函数的指针,以及指向返回 extents 的函数的指针。

更多详情see this question 或浏览 标签下的其他问题。

【讨论】:

  • 工作正常我的意思是它编译没有错误。我的印象是令人烦恼的解析会产生编译时错误。例如,对于 foo 类,像 foo a(); 这样使用它会在编译时出错,并且它是最令人头疼的解析形式。
  • @James Franco,除非您尝试像使用对象一样使用它
  • @JamesFranco 如果它不是一个有效的声明,那么它就不会是一个令人烦恼的解析。 “令人烦恼”的部分是因为您尝试编写变量声明,但它恰好在语法上作为函数声明有效。显然,函数声明是合法的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多