29

我从这里得到了代码。

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() )构造上发现歧义。

4

1 回答 1

29

这是因为它TimeKeeper time_keeper(Timer());被解释为函数声明而不是变量定义。这本身并不是错误,但是当您尝试访问get_time()time_keeper 的成员(这是一个函数,而不是 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();
}
于 2011-05-08T07:11:21.163 回答