【问题标题】:operator call syntax in C++C++ 中的运算符调用语法
【发布时间】:2012-10-29 17:55:24
【问题描述】:

是否会出现语法错误的情况

if (first == second) // ...

和那个不一样?

if (first.operator==(second)) // ...

我不这么认为,只是想知道。

【问题讨论】:

    标签: c++ operators comparison-operators


    【解决方案1】:
    a == b
    

    有时等价于

    a.operator==(b)
    

    有时相当于

    operator==(a,b)
    

    如果含义最终成为非类类型的 == 的“内置”含义,则有时不等于两者。

    每当编译器看到==时,如果至少有一种类型涉及到用户定义的类型,它就会搜索成员运算符(一定不能隐藏在a的类类型范围内)和非成员运算符(使用参数相关查找)和内置含义(因为一个类可能通过内置比较隐式转换为普通类型)。如果不止一个是有意义的,那就去重载决议的规则。

    【讨论】:

    • 其实如果发现不止一个,就去重载解析的规则了。名称查找非常愚蠢。
    【解决方案2】:

    如果您的意思是“两种语法何时不等价”,那么答案是当相等运算符不是first 的任何类型的成员时。显然,第二个变体不适用于没有成员 operator== 的类型。这包括内置类型。

    first 的类型确实存在成员运算符时,两者不同,因为非成员运算符可以允许firstsecond 的类型转换,而具有成员运算符的示例只能允许second 的转换。

    【讨论】:

    • 或者当first是一个内置类型时。
    • @SethCarnegie 对,在这种情况下,第二个示例将无法编译。
    【解决方案3】:

    两个语句具有不同效果的情况的一个例子是您对first 进行了隐式转换。例如:

    struct my_int
    {
        int num;
    
        my_int(int num) : num(num) {}
    };
    
    bool operator==(const my_int& a, const my_int& b)
    {
        return a.num == b.num;
    }
    

    在这种情况下,以下是有效的 C++ 代码:

    my_int a(1);
    int x = 1;
    
    if (x == a) {
        std::cout << "Equal\n";
    }
    

    在哪里编译这段代码:

    my_int a(1);
    int x = 1;
    
    if (x.operator==(a)) {
        std::cout << "Equal\n";
    }
    

    给出如下编译错误:

    conversion.cpp:在函数“int main()”中:conversion.cpp:21:16:错误: 请求非类类型的‘x’中的成员‘operator==’ 'int'

    【讨论】:

      【解决方案4】:

      第二个不适用于原语。但是,这两种形式都适用于已公开重载该运算符的自定义类型。

      【讨论】:

        【解决方案5】:

        如果您的问题仅基于语法,那么它取决于参数的类型。考虑以下代码:

        #include <iostream>
        
        using namespace std;
        
        class a {
        
        
        public:
        
          a(){
          }
        
          int operator ==(const a& v){
            cout << "member operator" << endl;
            return false;
          }
        
        };
        
        int operator ==(a &v1, a &v2){
            cout << "external operator" << endl;
            return true;
        }
        
        
        int main(){
        
          a a1, a2;
        
          if (a1 == a2 && a1.operator==((const a&)a2)) {
            cout << "done" << endl;
          }
        
        }
        

        在此设置中,两个运算符都被调用。 如果函数类型参数相同,似乎会优先选择该方法。

        【讨论】:

        • a1==a2 选择外部运算符的原因是它的参数a&amp; v2 比参数const a&amp; v 更适合左值a2const 很重要。
        • 当然,我只是在演示两种语法之间存在差异的可能性。根据函数类型,一种语法可能会产生与另一种不同的调用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        • 2013-05-19
        • 1970-01-01
        • 2020-10-18
        • 2012-02-28
        • 2016-10-28
        • 1970-01-01
        相关资源
        最近更新 更多