c++ - 最烦人的解析

标签 c++ most-vexing-parse

我从 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() ) 构造中的歧义。

最佳答案

这是因为 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();
}

关于c++ - 最烦人的解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31225809/

相关文章:

c++ - 使用 rdbuf 复制文件并从文件中读取不一致?

c++ - OpenGL纹理奇怪的颜色

c++ - 在 C++11 中定义 lambda 函数不会在类内部编译

c++ - 从 'Type (__cdecl *)(std::istream)' 到 'Type &' 的转换

C++: 奇怪的 "Request for member X of Y which is of non-class type Z"

c++ - 使用 lldb 调试器显示指针值

c++ - 将变量传递给 PUGIXML xml_tree_walker

c++ - Test t; 之间有什么区别?和测试 t();?如果 Test 是一个类

c++ - 强制将文件写入磁盘

c++ - 复制操作省略后对象无效?