当前位置:  开发笔记 > 编程语言 > 正文

为什么逗号,地址,逻辑AND和逻辑OR运算符不应该在c ++中重载?

如何解决《为什么逗号,地址,逻辑AND和逻辑OR运算符不应该在c++中重载?》经验,为你挑选了1个好方法。

有人可以用例子解释为什么在c ++中重载逗号,地址,逻辑AND和逻辑OR运算符不是一个好习惯吗?



1> Walter..:

根本原因是这些运算符的重载版本与内置版本的行为不同.这可能导致(人类)读/写代码的大量混淆.

    逻辑运算符&&||所述内置版本呈现短路优化:在表达式一样a && b,a首先计算且仅当true,b还评价; 类似地,在a || b,a首先计算且仅当false,b还评价.重载运营商&&,并||没有短路优化(包括ab一直被运用),也没有指定的参数评估的顺序.

    逗号运算符内置版本保证参数按它们出现的顺序进行求值,即a,b a先对其进行求值b.使用重载的逗号运算符,此保证将丢失(而功能参数机制将起作用).

    address-of operator&当应用于不完整类型的对象时,内置地址运算符和重载运算符之间可能存在混淆.考虑这段代码

    struct type;            // forward declaration: type is (as of yet) incomplete
    
    #include 
    void foo(type &obj)     // allowed: take object of incomplete type by reference
    {
      auto ptr1 = &obj;                  // address of obj -- or not?
      auto ptr2 = std::addressof(obj);   // always address of obj    
    }
    
    // possibly in a different translation unit:
    struct type
    {
      type* operator&() { return nullptr; }
    };
    

    此代码表现出未指定的行为:编译器可以实现&运算符的任一版本foo(),但编写代码的人foo()不能知道这个或将使用哪个运算符.使用std::addressofas 时可以避免这个问题ptr2,即使type有一个重载&运算符,也可以获得内置地址运算符的等价物.

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有