当您从 A 转换为 B 时,通过构造函数和转换运算符很容易。但是当你有一个“中间人”时,它与构造函数初始化之间的第三种类型一起工作,甚至当将一种类型与另一种类型等同时,但在函数调用中传递参数似乎不起作用。
我的问题:它是 C++ 中不受支持的东西还是我遗漏了什么?在下面的代码中查看我的 3 条评论。 (我使用的是 VS2015 update 3 的编译器)
class StringOut
{
public:
char* ptr = nullptr;
StringOut() {}
operator char*() { return ptr; }
};
class StringIn
{
public:
char* ptr = nullptr;
StringIn() {}
StringIn(char* ptr) { StringIn::ptr = ptr; }
void operator=(char* ptr) { StringIn::ptr = ptr; }
//StringIn(StringOut& ptr) { StringIn::ptr = ptr.ptr; }
};
void ff1(StringIn strin)
{
}
void ff1(int a)
{
}
void ff()
{
StringOut strout;
StringIn strin = strout; // compiles
strin = strout; // compiles
ff1(strout); // doesn't compile
};
当然,如果我使用注释掉的代码,我会工作。但我的问题是,我是否需要这样的直接运算符是 C++ 的局限性,还是我错过了什么?
最佳答案
自动转换仅“一步”完成。允许它执行两步操作不仅会使编译器的工作变得极其困难,甚至难以管理 - 您很快就会遇到太多的变体,并且不清楚该选择哪一个,而且还会使人们几乎无法理解所发生的事情。
所以是的,这是语言定义中的有意限制。
关于c++ - 调用函数时是否不支持间接转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39049490/