是 . - >在C和C++真的是运营商吗?

shu*_*alo 5 c c++ programming-languages operators

你可能已被打过,自己也是为了自己.和 - >是检索结构(C)或类(C++)成员的运算符.

但是,我怀疑它们是运算符 - 因为,如果它们是运算符,它们的输入类型是什么?此外,两侧的标识符是相互依赖的 - 例如+运算符缺少的特征.

如果这是正确的 - 在什么意义上这些仍然在实践中被标记为运算符,以及它们在语言理论方面的正式定义是什么.

Ste*_*314 6

您假设可以作为参数传递给运算符的唯一类型是可以在语言中定义的类型.

我认为编译器可以识别的任何类型都可以作为参数传递,包括内部类型,如"identifier".运算符在其AST表示中将有两个参数,这足以允许您定义语义.

另一个论点是语言理论可能为您的词汇提供一套定义,但它不是唯一的定义.

例如,操作员可以是操作机器的人.该定义与编程理论无关,但它不会阻止我使用特定于域的语言中的关键字来表达与机器操作有关的内容.类似地,术语"运算符"在数学中具有比编程理论特定的更宽的定义 - 并且该定义不仅仅通过使用编程语言而无效.

换句话说 - 如果你没有把它称为操作员,你会怎么称呼它?

编辑

为了澄清,我的第一个参数是指使用运算符(调用)的语法.这些运算符具有正确的参数,这些参数是标识符 - 成员名称 - C++语言无法使用数据类型表达.C++语言确实有成员指针,但它们与成员不同 - 就像变量与指向该变量的指针不同.

我认为这就是提到的问题.这些运算符的正确参数具有一种在语言中无法正常表达或操作的类型.

将语法映射到重载operator->函数时会发生什么是另一回事.该功能不是运营商 - 它只是运营商的实施方式.


Ebo*_*ike 5

我认为你可以->使用"operator"关键字重载运算符的事实应该是一个死的赠品.

智能指针经常这样做:

template<class T>
struct myPtr {
    T *operator ->()    { return m_ptr; }

    private:
        T *m_ptr;
};
Run Code Online (Sandbox Code Playgroud)

在.不重载,也是通过定义操作.


duf*_*ymo 1

该参考文献说它们都是 C++ 中的运算符:

http://www.cplusplus.com/doc/tutorial/operators/

这还不够权威吗?

  • @Steve314:不,当你向一个实际上没有“定义答案”的权威求助时,向权威求助只是一个无效的论点。C++ 标准定义了 C++ 语言中什么是运算符、什么不是运算符,*无论*运算符在其他地方是什么或意味着什么。 (7认同)
  • 正如我在另一条评论中所说 - 诉诸权威是一个被广泛认可的无效论点。C++ 标准委员会和参与定义该语言的人员可能用词不当。在这种情况下,他们没有,但仍然有空间来解释“为什么”措辞是合适的,而不是仅仅说“某某如此说”。 (3认同)
  • @Steve314:术语 *operator* 表示 C++ 中特定的东西。因此,判断某个东西是否是 C++ 中的运算符的唯一方法是查看定义,在本例中,定义是标准的。这不是诉诸权威——这确实是一个谬论——而是“诉诸定义”,这在同义反复上是正确的。您可能会争辩说,该规范的作者应该选择另一个术语(尽管我不同意),但您最多可以说的是“C++ 定义*运算符*很糟糕”。(如果您随后据此论证“操作员”在其他地方的含义相同,则可以向当局提出上诉。) (2认同)
  • @Antal - 当然,任何实质性文档都需要自己特定的术语定义。没关系。但这里的问题特别引用了编程理论中的正式定义,这些定义并不会仅仅因为我们谈论的是由特定文档和某些特定术语定义的特定语言而无效。对于某些问题,诉诸该标准是完全有效的,但在我看来,在这种情况下这是毫无意义的。更好地解释“为什么”词语的选择并不是坏事或误导。 (2认同)