有人可以用例子解释为什么在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 #includevoid 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::addressof
as 时可以避免这个问题ptr2
,即使type
有一个重载&
运算符,也可以获得内置地址运算符的等价物.