你可能已经被攻打过,自己也在为自己而战。和 - >是运算符,它检索结构(C)或类(C ++)的成员。
然而,我怀疑他们是运营商 - 因为,如果他们是运营商,他们的输入类型是什么?此外,两侧的标识符是相互依赖的 - 例如+运算符缺少的特征。
如果这是正确的 - 在某种意义上,这些仍然在实践中被标记为运算符,以及它们在语言理论方面的正式定义。
答案 0 :(得分:6)
您假设可以作为参数传递给运算符的唯一类型是可以在语言中定义的类型。
我认为编译器可以识别的任何类型都可以作为参数传递,包括内部类型,例如“identifier”。运算符在其AST表示中将有两个参数,这足以允许您定义语义。
另一个论点是语言理论可能为你的词汇提供一套定义,但它不是唯一的定义。
例如,操作员可能是操作机器的人。该定义与编程理论无关,但它不会阻止我使用特定于域的语言中的关键字来表达与机器操作有关的内容。类似地,术语“运算符”在数学中具有比编程理论特定的更广泛的定义 - 并且该定义不仅仅通过使用编程语言而无效。
换句话说 - 如果你没有把它称为运营商,会你称之为什么?
修改强>
为了澄清,我的第一个参数是指使用运算符(调用)的语法。这些运算符具有正确的参数,这些参数是标识符 - 成员名称 - C ++语言无法使用数据类型表达。 C ++语言 具有成员指针,但它们与成员不同 - 就像变量与指向该变量的指针不同。
我认为这就是提到的问题。这些运算符的正确参数具有无法在语言中正常表达或操作的类型。
将语法映射到重载的operator->
函数时会发生什么情况。该功能不是运营商 - 它只是运营商的实施方式。
答案 1 :(得分:5)
我认为您可以使用“operator”关键字重载->
运算符这一事实应该是一个绝对的赠品。
智能指针经常这样做:
template<class T>
struct myPtr {
T *operator ->() { return m_ptr; }
private:
T *m_ptr;
};
.
不可重载,但根据定义也是运算符。
答案 2 :(得分:3)
嗯... sizeof
是一个运算符,它的输入类型是什么?在这种情况下,我不认为这个问题对于区分运营商和非运营商是有用的。
它的意思是。刘易斯卡罗尔的阴影在这里。
答案 3 :(得分:1)
你可以重载 - &gt;运营商:Wikipedia。该页面还指出您不能超载点。有一个例子 - &gt;重载here:
class String // this is handle
{
...
Stringrep *operator -> () const { return b_; }
private:
Stringrep *b_;
}
箭头对箭头左侧的值起作用,并返回左侧“保持在里面”的任何内容。想想smart pointer。
答案 4 :(得分:1)
答案 5 :(得分:1)
C ++ 03标准将两者都称为运算符。
示例:
......之后。运算符应用于其类的类型的表达式...
如果您对该术语不满意,可以使用术语标点符号.
。
答案 6 :(得分:1)
在线C标准(n1256):
6.5.2.3结构和工会成员
约束
1.
运算符的第一个操作数应具有合格或不合格的结构或联合 类型,第二个操作数应命名该类型的成员。
2->
运算符的第一个操作数应具有指向限定或不合格的类型''指针 结构''或''指向合格或不合格的联合''的指针,第二个操作数应为 命名指向的类型的成员。
它们是运算符,它们的输入类型由标准指定。
答案 7 :(得分:0)