我这有的函数返回值是bool类型,有的是HRESULT类型。HRESULT是long类型的typedef。
混用可能会出现下面的错误。
本质是bool和long之间的隐式转换,不光返回值,实际上任何赋值、if判断的地方都可能出现这种隐式转换。
但主要关心的是return时的转换,因为我把return放在宏里面。
bool foo(){
...
return E_FAIL; // 会被转换成true
}
HRESULT bar() {
...
return false; //会被转换成S_OK
}
定义新的类型strong_bool、strong_long(或者strong_HRESULT),然后把对应函数的返回值bool、HRESULT声明改为strong_bool、strong_long,可以阻止这种隐式转换。
有没有其他的搞法?看了一下c++20的concept,貌似搞不了这种、只能搞函数的参数?
class strong_bool {
public:
explicit strong_bool(const bool rhs) : m_value{rhs} {}
template <typename T> strong_bool(T rhs) = delete;
operator bool() const { return m_value; }
private:
bool m_value;
};
strong_bool foo() { return E_FAIL; } // 编译失败
--
FROM 114.254.46.*