C++ 重载转换运算符黑客
C++ Overloading conversion operator hack
我正在尝试实现一个黑客攻击,我试图重载返回。我会让代码说话。
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::string
和char
。这两者都可以使用tcn::proxy
调用:第一个使用std::string
转换运算符,第二个使用int
转换运算符,然后进行积分转换。
通常,重载分辨率会更喜欢没有必要标准转换的隐式转换序列,而不是需要积分转换的转换序列,但仅当两个转换序列通过相同的函数时,才会考虑此选择。由于您有两条单独的路径通过两个不同的函数,因此调用是不明确的。
解决方案是不要对这样的事情使用积分转换;它只会导致奇怪的边缘情况、令人惊讶的行为和隐藏的错误。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- C++ 重载转换运算符黑客