bor*_*ree 0 c++ oop operator-overloading logical-operators c++11
有人可以用例子解释为什么在c ++中重载逗号,地址,逻辑AND和逻辑OR运算符不是一个好习惯吗?
根本原因是这些运算符的重载版本与内置版本的行为不同.这可能导致(人类)读/写代码的大量混淆.
逻辑运算符&&和||所述内置版本呈现短路优化:在表达式一样a && b,a首先计算且仅当true,b还评价; 类似地,在a || b,a首先计算且仅当false,b还评价.重载运营商&&,并||没有短路优化(包括a和b一直被运用),也没有指定的参数评估的顺序.
逗号运算符内置版本保证参数按它们出现的顺序进行求值,即a,b a先对其进行求值b.使用重载的逗号运算符,此保证将丢失(而功能参数机制将起作用).
address-of operator&当应用于不完整类型的对象时,内置地址运算符和重载运算符之间可能存在混淆.考虑这段代码
struct type; // forward declaration: type is (as of yet) incomplete
#include <memory>
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; }
};
Run Code Online (Sandbox Code Playgroud)
此代码表现出未指定的行为:编译器可以实现&运算符的任一版本foo(),但编写代码的人foo()不能知道这个或将使用哪个运算符.使用std::addressofas 时可以避免这个问题ptr2,即使type有一个重载&运算符,也可以获得内置地址运算符的等价物.