C++ 重载转换运算符黑客

C++ Overloading conversion operator hack

本文关键字:黑客 运算符 转换 重载 C++      更新时间:2023-10-16

我正在尝试实现一个黑客攻击,我试图重载返回。我会让代码说话。

namespace tcn
{
    class foo
    {
        std::string blah;
    public:
        class proxy
        {
            int intval;
            std::string strval;
        public:
            proxy(int intv, std::string strv) : intval(intv), strval(strv) {};
            operator int() const { return intval; }
            operator std::string() const { return strval; }
        };
        foo();
        ~foo();
        proxy get();
    };
    foo::foo()
    {
        // Create stuff //
    }
    foo::~foo()
    {
        // Destroy stuff //
    }
    foo::proxy foo::get()
    {
        int intval = 911;
        std::string strval = "Hello!?";
        proxy temp(intval, strval);
        return temp;
    }
}

int main()
{
    tcn::foo bar;
    std::string ts = bar.get(); // OK
    int ti = bar.get(); // OK
    ti = bar.get(); // OK
    ts = bar.get(); // Compile error here
    return 0;
}

如果我尝试编译代码,它会给出如下错误

错误:"运算符="的重载不明确(操作数类型为 'std::string {aka std::basic_string}' 和 'tcn::foo::p roxy')
ts = bar.get();

我想知道如何克服这个问题。我已经看到了通过使用"提示"来实现这一点的其他方法,但是我试图为用户提供一个简单的界面。所以我正在寻找来自用户端的简单任务。否则如何实施?

提前感谢您,如果这看起来很蹩脚 - 我道歉。我在C++方面不是那么好。

调用不明确,因为std::string::operator=具有重载,需要std::stringchar。这两者都可以使用tcn::proxy调用:第一个使用std::string转换运算符,第二个使用int转换运算符,然后进行积分转换。

通常,重载分辨率会更喜欢没有必要标准转换的隐式转换序列,而不是需要积分转换的转换序列,但仅当两个转换序列通过相同的函数时,才会考虑此选择。由于您有两条单独的路径通过两个不同的函数,因此调用是不明确的。

解决方案是不要对这样的事情使用积分转换;它只会导致奇怪的边缘情况、令人惊讶的行为和隐藏的错误。