调用函数时不支持间接强制转换



当你从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++的限制,我需要这样的直接运算符,还是我错过了什么?

自动转换只完成'一步'。允许它分两步执行,不仅会使编译器的工作变得极其困难(如果不是难以管理的话)——你很快就会遇到太多的变化,而且不清楚该选择哪一个,而且还会让人类几乎无法理解发生了什么。

所以,是的,这是语言定义中的一个有意的限制。

最新更新