8.3.5/ cv-qualifier-seq 只能是非静态成员函数的函数类型、成员指针所指的函数类型或函数 typedef 声明的顶级函数类型的一部分。函数声明器中 cv-qualifier-seq 的效果与在函数类型之上添加 cv-qualification 不同,即它不会创建 cv-qualified 函数类型。
如果我没看错,您可以在 const 成员函数中返回指向非 const 成员的指针。您将无法使用非 const 对象调用它。
一种禁止调用的方法是:
private:
struct private_
{
void this_type_does_not_support_comparisons() {}
};
public:
typedef void (private_::*bool_type)() const;
operator bool_type() const
{
return ok_ ? &private_::this_type_does_not_support_comparisons : 0;
}
仍然可以比较指向成员函数的指针是否相等。您必须为触发错误的类型编写operator==
and 。使用安全布尔惯用语的 CRTP 形式更容易,因为这些运算符成为模板,因此可能具有错误的主体。operator!=
Testable::bool_type
例子:
template <typename T>
class safe_bool_concept
{
// Implementation detail of safe bool
protected:
~safe_bool_concept() {}
public:
operator safe_bool() const
{
return static_cast<const T*>(this)->is_null() ? ...;
}
};
struct Foo : safe_bool_concept<Foo>
{
...
private:
friend class safe_bool_concept<Foo>;
bool is_null() const { ... }
};
那么你可以这样做(对 做同样的事情!=
):
template <typename T>
void operator==(const safe_bool_concept<T>& x, const safe_bool_concept<T>&)
{
x.some_private_member(); // invalid, but won't be generated
// unless safe_bool classes are compared
}
这意味着如果您想禁止比较,则应通过 CRTP 实现安全布尔惯用语。然而,与零的比较仍然有效。
如果你走非成员函数路线,你还必须提供<
, >
,<=
等等>=
。