猿问

最烦人的解析

最烦人的解析

我从这里.

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() )建筑。


湖上湖
浏览 420回答 2
2回答

心有法竹

这是因为TimeKeeper time_keeper(Timer());被解释为函数声明,而不是变量定义。这本身并不是一个错误,但是当您试图访问get_time()时间守护者(这是一个函数,而不是计时器实例)的成员,您的编译器会失败。编译器就是这样看待代码的: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节中说,在这种情况下,定时器函数类型会被调整成为函数类型的指针,但是为什么有人希望从一开始就对其进行调整呢?在我看来,第13.1/3节造成了整个“最令人烦恼的解析”问题?
随时随地看视频慕课网APP
我要回答