最烦人的解析 [英] Most vexing parse

查看:30
本文介绍了最烦人的解析的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从这里获得了代码.

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();
}

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

From the looks of it, it should get compile error due to the line:

TimeKeeper time_keeper(Timer());

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

But it only happens if return time_keeper.get_time(); is present.

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

Why would this line even matter, the compiler would spot ambiguity on time_keeper(Timer() ) construction.

推荐答案

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

This is due to the fact that TimeKeeper time_keeper(Timer()); is interpreted as a function declaration and not as a variable definition. This, by itself, is not an error, but when you try to access the get_time() member of time_keeper (which is a function, not a TimeKeeper instance), your compiler fails.

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

This is how your compiler view the code:

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();
}

这篇关于最烦人的解析的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆