`操作符类型&`混淆

Cap*_*ths 1 c++ casting static-cast

我有用户定义的类型:

class String::CharProxy
{
public:
    const char* operator&() const;
    char* operator&();
    operator char() const;
    operator char&();
};
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试执行一些显式转换时,调用了错误的运算符:

CharProxy p(...);
static_cast<char>(p); // operator char&() call instead of operator char() const
Run Code Online (Sandbox Code Playgroud)

我希望在投射到和-仅投射到时operator char() const被呼叫。charoperator char&()char&

谁能解释一下这个机制是如何运作的?我有什么地方弄错了吗?

Win*_*ute 6

在您的 中static_cast, 和operator char() const都是operator char&()根据 [over.match.conv] 的候选函数,因为 和charchar&可以char通过标准转换序列进行转换。

在这两个函数之间,编译器然后根据标准重载解析规则进行决定。在这些中,operator char&()被发现更适合,因为它的隐式this参数与您传递给它的对象具有相同的 cv 限定符(即: 上没有const限定符p)。您可以显式调用另一个运算符

static_cast<char>(static_cast<CharProxy const &>(p));
Run Code Online (Sandbox Code Playgroud)

但从更现实的角度来说: 1. 用户定义的转换函数是一个马蜂窝,99% 的情况下最好避免使用,2. 如果您的operator char() const语义与您的语义如此不同operator char&(),以至于您不能使用后者,而您可以使用前者,你在那里建造的东西似乎非常危险。当然,它不符合 POLA 标准。