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&
谁能解释一下这个机制是如何运作的?我有什么地方弄错了吗?
在您的 中static_cast, 和operator char() const都是operator char&()根据 [over.match.conv] 的候选函数,因为 和char都char&可以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 标准。