8

最初のコメント行が正しくコンパイルされるのに、2番目の行は正しくコンパイルされないのはなぜですか?

aコンストラクター引数としてそれ自体を指定できるのに、できないのはなぜbですか?
二人は同じことをしていませんか?

class Foo { Foo &operator =(Foo const &); /* Disable assignment */ };

int main()
{
    Foo a = a;  // OK
    Foo  b(b);  // error C2065: 'b' : undeclared identifier
}

アップデート

コンパイラに依存しているように見えるので、思ったよりも問題が深刻なようです。
それで、質問の別の部分は、次のコードが有効かどうかということだと思います。

GCCでエラーが発生しますが、VisualC++は問題なく実行します。

int main()
{
    int i = 0;
    { int *i(&i); }
    return i;
}
4

2 に答える 2

4

最初のコードでは、両方の宣言をコンパイルする必要があります。GCCはすぐそこにあります。VisualC++コンパイラにはバグがあります。

そして2番目のコードでは、内部宣言はコンパイルされるべきではありません。GCCもそこにあり、VC++は間違っています。

GCCはどちらの場合も正しいです。

のようなコードは、構文の観点int a=a+100;からint a(a+100);は問題ありません。静的ストレージ期間自動ストレージ期間のどちらで作成されたかによっては、未定義の動作が発生する可能性があります。

int a = a + 100; //well-defined. a is initialized to 100
                 //a on RHS is statically initialized to 0
                 //then a on LHS is dynamically initialized to (0+100).
void f()
{
   int b = b + 100; //undefined-behavior. b on RHS is uninitialized

   int a = a + 50; //which `a` is on the RHS? previously declared one?
                   //No. `a` on RHS refers to the newly declared one.
                   //the part `int a` declares a variable, which hides 
                   //any symbol with same name declared in outer scope, 
                   //then `=a+50` is the initializer part.
                   //since a on RHS is uninitialized, it invokes UB
}

上記の各宣言に関連するコメントをお読みください。

静的ストレージ期間の変数は、コンパイル時に静的にゼロに初期化され、初期化されている場合は、実行時に動的に初期化されることに注意してください。ただし、自動保存期間を持つPODタイプの変数は、静的に初期化されません。

静的初期化と動的初期化の詳細については、以下を参照してください。

于 2013-02-01T05:54:17.307 に答える
1

最初の例では、お気づきのように、構文は問題ありませんが、動作は未定義です。したがって、コンパイラはコードを拒否することが許可されます(ただし、未定義の動作は保証されている必要があります。ここにありますが、無効な初期化が実際に実行されなかった場合はそうではありません)。

2番目の例には、タイプエラーがあります。宣言は、宣言子が表示されるとすぐに表示され、特に、独自の初期化子で表示されます。MSVC ++は可視性を遅らせます:これはそのコンパイラの既知の不適合の問題です。たとえば、EDGコンパイラ(Microsoftモードがあります)の場合:

$ ./cfe --strict x.c
"x.c", line 4: error: a value of type "int **" cannot be used to initialize an
          entity of type "int *"
      { int *i(&i); }
               ^

1 error detected in the compilation of "x.c".
$ ./cfe --microsoft x.c
"x.c", line 4: warning: variable "i" was declared but never referenced
      { int *i(&i); }
             ^
于 2013-02-01T15:01:54.627 に答える