61

ここでテストを行いましたが、出力が終わりのないループになっています。理由はわかりません。

実は別のテストを行っているのですが、これを書いた時点ではループがどのように発生したのかわかりません。「ABC」と繰り返し出力されます。

#include <map>
#include <string>
#include <iostream>

class test
{
public:
   std::map <int, int> _b;
   test();
   test (std::map<int, int> & im);
   ~test();
   };

test::test()
{
  std::cout<<"abc";
  _b.clear();
  _b[1]=1;
  test(_b);
}

test::test(std::map <int, int>& im)
{
   std::cout<<im[1];
}

test::~test() {};

int main ()
{
   test a;  
}
4

4 に答える 4

94

ここでの問題は、コンパイラが解釈することです

test(_b);

testparameter で渡される型の一時オブジェクトを作成するコードとしてではなく、デフォルトのコンストラクターを使用して、type_bという名前の変数の変数宣言として。したがって、 2 番目のコンストラクターを使用して一時オブジェクトを作成するコードのように見えるものは、代わりに、型の新しいオブジェクトを再帰的に作成し、もう一度コンストラクターを呼び出しています。_btesttesttest

これを修正するには、変数に次のような明示的な名前を付けます。

test t(_b);

これは、2 番目のコンストラクターを使用して初期化された、型testnamedの変数としてのみ解釈できます。t

私はこれまで見たことがなく、何年もの間 C++ でプログラミングしてきました。言語のさらに別のコーナーケースを見せてくれてありがとう!

公式の説明: C++03 ISO 仕様、§6.8 によると:

式ステートメントと宣言を含む文法にはあいまいさがあります。左端の部分式として関数スタイルの明示的な型変換 (5.2.3) を使用する式ステートメントは、最初の宣言子が ( で始まる宣言と区別できない場合があります。そのような場合、ステートメントは宣言です。

(私の強調)。つまり、C++ がステートメントを式 (一時的なオブジェクトのキャスト) または宣言 (変数の) として解釈できる場合はいつでも、宣言を選択します。C++仕様は明示的に与えます

T(a);

宣言の例として、a型の何かへのキャストではありませんT

これは C++ の最も厄介な解析です。式のように見えるものは、代わりに宣言として解釈されます。MVP は以前に見たことがありますが、このコンテキストで見たことはありません。

お役に立てれば!

于 2013-04-24T20:08:42.940 に答える