2012-03-19 12 views
8
#include <stdlib.h> 
#include <iostream> 
#include <vector> 
#include <string> 
class A 
{ 
public: 
    std::string s; 
    A() 
    { 
     s = "string"; 
     new(this)A(*this); 
    } 
}; 
int main() 
{ 
    A a; 
    std::cout<<a.s; 
    return 0; 
} 

出力に空の文字列があります。このような動作についてC++標準は何を言っていますか?ここでは、少なくとも二つの問題が存在しなければならない他のコンストラクタ内でコピーコンストラクタを呼び出す

+3

Auwgh、私は今、本当にコーヒーが必要です。 –

+0

GCC 4.5の出力で 'string'を取得しました – CapelliC

+0

これは 'new(this)A(* this);'他のコンストラクタ内でコピーコンストラクタを呼び出していますか? –

答えて

4

  • あなたは、コンストラクタ内部自身のコピー
  • で初期化しようとすると、Aは、まだ完全に構築されていないので、あなたが実際にそれをコピーすることはできません

new(this)はそれ自体が疑わしいです。

+1

'new(this)'結構です。また、自分自身のコピーを持つものに割り当てることは、通常、動作することが保証されます(コピー代入演算子は自己割り当てを守る必要があります)。一方、コピーの作成は、別の問題です。 –

+0

@ Konrad:デフォルト(生成された)コピーctorは自己割り当てに対して保護されているため、実際のコピーは実行されませんか?中間変数A a(* this)と思われます。新しい(これ)(a); "問題"を解決する? – user396672

+0

@ user396672何も並べ替えがありません。デフォルトの*コピー代入演算子*は自己割り当てを防ぎます。私は、デフォルトのコピーコンストラクタがそうではないと思う。なぜなら、このケースは通常は決して起こらないはずだからだ。 –

0

sさんのコンストラクタを2回連続して呼び出しています。これは、ergoです。動作は定義されていません(ほとんどの場合、メモリがリークしている可能性があります)。