は、次のコードを考えてみましょう:C++ - デストラクタが予想以上回呼び出され
class C1
{ public:
C1(){ cout<<"CONSTR WAS HERE"<<endl; }
C1(const C1&ob){ cout<<"COPY CONSTR WAS HERE"<<endl; }
~C1(){ cout<<"DESTR WAS HERE"<<endl; }
}
void f1(C1 x){ }
int main()
{
C1 c1;
f1(c1);
}
そのまま私たちは、コードを実行すると、我々が得る:
から完全に理解できるCONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
私の視点。
C1のF1(C1 X){}
代わりに
空隙F1(C1 X){}
:しかし、我々は、 "F1" 機能を変更し、場合
は、我々が得る:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
と私はなぜそれほど確かではありません。
'C1 f1(C1 x){}'は実際には値を返さないため、未定義の動作をします。 – AndyG
何かを返す関数を宣言した場合(戻り値の型が 'void'以外の場合)、*関数は*何かを返さなければなりません。そうしないと、*未定義の動作*(http://en.cppreference。 com/w/cpp/language/ub)(これはあなたのプログラムを不正な形式にして無効にします)。 UBを使ってプログラム内のあらゆる種類の行動を推測することは、議論の対象となります。 –