2016-10-04 10 views
3

誰かが次のことがうまくいかない理由を説明することができますか、次のコードを試してみてください。ポインタから非スカラーオブジェクトタイプへの変換?

class A { 
public : 
    int32_t temp ; 
    A (bool y = false ) { } 
} ; 

int main (int argc, char *argv[]) 
{ 

    A temp ; 
    temp = new A() ; 
    temp.temp = 5 ; 

    std::cout << " " << temp.temp << std::endl ; 
    return EXIT_SUCCESS; 
}    // ---------- end of function main ---------- 

答えて

7

あなたの場合コンパイラはimplicitly defined Copy/Move Assignment operatorを使用しました。コンストラクタを使用してAのポインタを最初に構築するのはboolです。


すべてのポインタ型はimplicitly convertible C++でboolにあります。そのようなナンセンスを防止するための2つの方法があります。このように

  • explicitコンストラクタ
  • deletedコンストラクタ

が、あなたはこれを行うことができます。

のみ void*を取るコンストラクタを定義
class A { 

    public : 
    int32_t temp ; 
    explicit A(bool y = false ) { 
    } 

    //Additionally 
    A(void*) = delete; 
}; 

削除されたとして、そのより高いコンストラクタのoverload resolutionランクを持ちますポインタを渡すときのコンストラクタ。ポインターを渡すたびにオーバーロードの解像度で選択され、削除されるため、プログラムは不正な形式になります。

関連する問題