代码之家  ›  专栏  ›  技术社区  ›  Vatsan

C++中显式调用原始算子函数

  •  6
  • Vatsan  · 技术社区  · 14 年前
    int a, b, c; 
    
    //do stuff. For e.g., cin >> b >> c; 
    
    c = a + b;          //works 
    c = operator+(a,b); //fails to compile, 'operator+' not defined. 
    

    另一方面,这是可行的-

    class Foo
    {
     int x; 
    public:
     Foo(int x):x(x) {} 
    
     Foo friend operator+(const Foo& f, const Foo& g)
     {
      return Foo(f.x + g.x); 
     }
    
    };    
    
    Foo l(5), m(10); 
    
    Foo n = operator+(l,m); //compiles ok! 
    
    • 甚至可以直接调用原语类型(如int)的operator+(和其他运算符)吗?
    • 如果没有,有没有一个C++参考语言来说明这是不可行的?
    2 回复  |  直到 14 年前
        1
  •  8
  •   AnT stands with Russia    14 年前

    首先,将内置运算符作为函数调用并不能简单地工作,因为语言规范从来没有说过这样的函数存在。内置运算符只是运算符。它们背后没有实现函数,仅仅是因为语言规范从未暗示它们的存在。基于函数的实现特定于 超载

    其次,在重载解析过程中,内置运算符实际上是由其虚构的类似于函数的对应项来表示的,但是禁止“显式”类似于函数的内置运算符调用的措辞出现在13.6/1中

    候选运算符的功能是 表示内置运算符 第5条中的定义在 本子条款。这些候选人 参与操作员的功能 过载解析过程为 如13.3.1.2所述 没有其他目的 .

        2
  •  2
  •   David Titarenco    14 年前

    http://www.parashift.com/c++-faq-lite/intrinsic-types.html

    我可以定义一个与内置/内在/基本类型一起工作的运算符重载吗?

    不,C++语言要求 运算符重载至少需要 “类类型”或 枚举类型。C++语言 不允许您定义运算符 所有操作数/参数为 原始类型的。

    operator==需要两个字符*s和 使用字符串比较。很好 因为如果s1和s2是 char*,表达式s1==s2已经 有一个明确的含义:它 比较两个指针,而不是两个指针 指针指向的字符串。 无论如何你不应该使用指针。使用 std::字符串而不是char*。

    内置类型上的运算符,您 不知道1+1是什么 包括其中一个 标题重新定义了均值的加法, 例如,减法。

    C++标准{5.5.6