【问题标题】:Most vexing parse最烦人的解析
【发布时间】:2011-08-21 00:45:33
【问题描述】:

我从here获得了代码。

class Timer {
 public:
  Timer();
};

class TimeKeeper {
 public:
  TimeKeeper(const Timer& t);

  int get_time()
  {
      return 1;
  }
};

int main() {
  TimeKeeper time_keeper(Timer());
  return time_keeper.get_time();
}

从它的外观来看,它应该由于以下行而出现编译错误:

TimeKeeper time_keeper(Timer());

但只有在存在return time_keeper.get_time(); 时才会发生。

为什么这条线很重要,编译器会发现 time_keeper(Timer() ) 构造的歧义。

【问题讨论】:

标签: c++ most-vexing-parse


【解决方案1】:

这是因为TimeKeeper time_keeper(Timer()); 被解释为函数声明而不是变量定义。这本身并不是一个错误,但是当您尝试访问 time_keeper 的 get_time() 成员(它是一个函数,而不是 TimeKeeper 实例)时,您的编译器会失败。

这是编译器查看代码的方式:

int main() {
  // time_keeper gets interpreted as a function declaration with a function argument.
  // This is definitely *not* what we expect, but from the compiler POV it's okay.
  TimeKeeper time_keeper(Timer (*unnamed_fn_arg)());

  // Compiler complains: time_keeper is function, how on earth do you expect me to call
  // one of its members? It doesn't have member functions!
  return time_keeper.get_time();
}

【讨论】:

  • 虽然我知道标准在 §13.1/3 中说 Timer 函数类型在这种情况下被调整为指向函数类型的指针,但为什么有人希望它开始调整呢?在我看来,§13.1/3 创造了整个“最令人头疼的解析”问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
相关资源
最近更新 更多