C++ 取消引用和使用点运算符与使用箭头运算符之间有区别吗

C++ is there a difference between dereferencing and using dot operator, vs using the arrow operator

假设我有以下变量:

MyObject* obj = ...;

如果这个对象有字段foo,有两种访问方式:

  1. obj->foo
  2. (*obj).foo

使用一种方法与使用另一种方法有什么区别吗?或者第一种方法只是第二种方法的语法糖?

我在想也许第一个可能会导致对象的复制构造函数被调用,因为它现在持有该值。

obj是指针时没有区别。

如果 obj 是某些 class 的对象,obj->foo 将调用 operator->()(*obj).foo 将调用 operator*()。理论上你可以重载它们来做完全不同的行为,但那将是一个非常糟糕的设计 class.

根据§7.6.1.5 ¶2 of the ISO C++20 standard,表达式obj->foo被转换为(*obj).foo。所以它只是语法糖。两者是等价的。

I was thinking maybe the first one could cause the copy constructor of the object to be called since it is now holding onto the value.

不会调用构造函数,因为没有创建新对象。

is the first method just syntactic sugar for the second?

是的。

I was thinking maybe the first one could cause the copy constructor of the object to be called

没有


从技术上讲,operator. 不能为 类 重载,而 operator-> 可以重载。运算符 ->* 应该重载,以便 it->foo(*it).foo 保持等效,尽管语言在技术上不强制执行。