2016-08-20 23 views
0

AからBにキャストするときは、コンストラクタやキャスト演算子を使用すると簡単です。しかし、あなたが "仲介人"を持つとき、3つ目の型はコンストラクタの初期化や、ある型を他の型と同じにしても機能しますが、関数呼び出しで渡すパラメータは機能しません。関数の呼び出し時に間接キャストがサポートされていませんか?

私の質問:これはC++でサポートされていないことですか、何か迷っていますか?以下のコードで私の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 
}; 

を(私はVS2015更新3のコンパイラを使用しています)。しかし、私の質問は、このような直接演算子が必要なのはC++の限界かどうかです。

+1

確かにコンパイラは「コンパイルしない」以上のことを言っています。 –

+0

コンストラクタの初期化で「仲介者」キャストが機能するというあなたの信念の根拠は何ですか?ここには何も示されていません。 – EJP

+0

'StringIn strin = strout;'のようなコードは、コンストラクタ型の初期化であり、 'StringInstrin(strout);と同じです。 – Thomas

答えて

2

自動変換は「ワンステップ」でのみ実行されます。これを2段階にすることで、コンパイラの作業を非常に困難にするだけでなく、手に負えないほど速く実行することができます。また、どれを選択するのか不明確ですが、人間にとってはまったく理解できません。

はい、これは言語定義の意図的な制限です。

+0

実際、私はこの制限に満足しています、私はちょうど二重チェックしたいと思いました。答えてくれてありがとう! – Thomas

関連する問題