c++ - 为什么 MSVC 不能正确解析 this->sth 对重载 operator-> 的调用

标签 c++ visual-c++ operator-overloading clang language-lawyer

考虑以下代码:

#include <iostream>

class LayoutConstraintInfo {
public:
  void print() const {
    std::cout << "Called LayoutConstraintInfo::Print";
  }
};

class LayoutConstraint {
  LayoutConstraintInfo *Ptr;
  LayoutConstraintInfo *operator->() const { return Ptr; }

public:
  void print() const {
    std::cout << "Called LayoutConstraint::Print";
    this->print();
  }
};

int main() {
  LayoutConstraint().print();
  return 0;
}

程序因堆栈溢出异常而崩溃(使用 MSVC 19.00.24215.1)。

但是,看看这个示例,我希望得到以下输出:

CalledLayoutConstraint::Print

CalledLayoutConstraintInfo::Print

这是因为我希望调用 this->print() 来调用重载的 LayoutConstraintInfo *operator->() 运算符。 因此,对 LayoutConstraint::Print 的调用将调用 LayoutConstraintInfo::Print

我发现将 Clang 项目移植到 MSVC:MSVC 发出了递归警告,导致运行时堆栈溢出。 Clang 似乎没有提示,但我的 Windows PC 上没有任何版本的 Clang

最佳答案

I expect a call to this->print() to call the overloaded LayoutConstraintInfo *operator->() operator.

没有。请注意,operator-> 仅使用类本身类型的对象调用,而不是它的指针。这意味着当使用 LayoutConstraint 而不是 LayoutConstraint *(例如 this )。 this->print() 总是会直接调用成员函数LayoutConstraint::print(),导致无限递归。

您可以将其更改为与 LayoutConstraint 类型的对象一起使用,例如 *this

void print() const {
  std::cout << "Called LayoutConstraint::Print";
  (*this)->print();
}

顺便说一句:您可以使用 clang here 尝试一下.

关于c++ - 为什么 MSVC 不能正确解析 this->sth 对重载 operator-> 的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41650348/

相关文章:

c++ - 程序关闭/退出时删除.txt文件(X按钮)

c++ - 您如何使用映射值?

visual-studio - Visual Studio不允许我使用某些变量名

c++ - 使用 C++ union ,当您想要哪个成员未知时

c++ - 在哪里可以找到运算符重载列表?

c++ - 重载运算符 && 和 || 短路在 C++17 中

c++ - 删除链表C++末尾的节点

c++ - RapidXML XML解析错误

c++ - 线程安全管道端接

c++ - pcl_visualizer.cpp 与 2015 构建错误