【问题标题】:Since C++ knows type, can it infer dot and arrow? [duplicate]既然 C++ 知道类型,它可以推断点和箭头吗? [复制]
【发布时间】:2019-09-13 01:15:40
【问题描述】:

假设我有这个代码

std::string s = "hello";
std::string* p = &s;
int l = p.length();

Visual Studio 和 CLion 知道点运算符不正确。实际上,当我按下键 . 时,两个 IDE 都将击键提交为->

既然 C++ 是有类型的,它就知道 p 是一个指针,为什么不去 combine 。和 -> 合二为一?

语法可以是一直使用.,如果p是指针,先解引用,否则直接获取它的成员?

【问题讨论】:

  • 为什么不结合。和 -> 合二为一? 因为它们是不同的东西。对于智能指针,你也可以同时使用。
  • 注意->可以重载,而.不能。
  • 冗余很有帮助。此外,有些智能指针需要 both .-> 来处理不同的事情。
  • s.begin().s.begin()-> 的 CLion 和 VS 提示是什么? ;)
  • 那是 Java。

标签: c++ ide


【解决方案1】:

类可以重载箭头运算符,因此可以有.-> 都有效的对象。智能指针(例如 std::unique_ptrstd::shared_ptr)和迭代器是常见的示例。

std::unique_ptr<Foo> f;
f.reset(new Foo(42));
f->bar();

你能设计一种没有这种区别的静态类型语言吗?当然。但是 C++ 已经以这种方式发展了,这不是你今天可以在不破坏大量代码的情况下改变的东西。

【讨论】:

  • 如果您阅读了副本,很明显 C++ 获得箭头运算符纯粹是靠运气——我们可能永远不会拥有它!这意味着重载它也是不可能的(幸运的是它不会专门为 C++ 引入),而且我们不会有智能指针!
  • @SergeyA 它们实际上是我不知道的超级有趣的历史片段(从 C 更类似于被美化的宏汇编器的时候开始),谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2022-01-06
  • 2013-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多