当你从A转换到B时,很容易通过构造函数和转换操作符。但是当你有一个"中间人"时,中间的第三种类型它可以与构造函数初始化一起工作,甚至可以将一种类型等同于另一种类型,但是在函数调用中传递参数似乎不起作用。
我的问题:这是c++中不支持的东西还是我错过了什么?请参阅下面代码中的3条注释。(我使用VS2015更新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++的限制,我需要这样的直接运算符,还是我错过了什么?
自动转换只完成'一步'。允许它分两步执行,不仅会使编译器的工作变得极其困难(如果不是难以管理的话)——你很快就会遇到太多的变化,而且不清楚该选择哪一个,而且还会让人类几乎无法理解发生了什么。
所以,是的,这是语言定义中的一个有意的限制。