0

標準によると、制御構造で変数を宣言する場合と、他の場所で変数を宣言する場合の動作の違いは何ですか? 私はそれについての言及を見つけることができないようです。

私が言っていることが明確でない場合は、例を次に示します。

if (std::shared_ptr<Object> obj = objWeakPtr.lock())

ご覧のとおりobj、if ブロックでローカル変数 を宣言して初期化しています。

また、条件の代わりにこの構文を使用した場合に特別な動作が与えられない理由について、技術的な理由はありますか? たとえば、括弧のセットを追加すると、コンパイラ エラーが発生します。これにより、変数が他の条件と連鎖することも防止されます。

// Extra brackets, won't compile.
if ((std::shared_ptr<Object> obj = objWeakPtr.lock()))

// If the above were valid, something like this could be desirable.
if ((std::shared_ptr<Object> obj = objWeakPtr.lock()) && obj->someCondition())
4

2 に答える 2

3

標準によると、制御構造で変数を宣言する場合と、他の場所で変数を宣言する場合の動作の違いは何ですか? 私はそれについての言及を見つけることができないようです。

制御構造イントロダクション内の宣言は、他の場所の宣言と同じです。そのため、違いを見つけることができません。

6.4/3 では、これに関するいくつかの特定のセマンティクスについて説明していますが、驚くべきことではありません。

[n3290: 6.4/3]:条件の宣言によって導入された名前 ( type-specifier-seqまたは条件の宣言子によって導入された) は、その宣言のポイントから条件によって制御されるサブステートメントの終わりまでの範囲内にあります。条件によって制御されるサブステートメントの最も外側のブロックで名前が再宣言されている場合、名前を再宣言する宣言は形式が正しくありません。[..]


また、条件の代わりにこの構文を使用した場合に特別な動作が与えられない理由について、技術的な理由はありますか? たとえば、括弧のセットを追加すると、コンパイラ エラーが発生します。これにより、変数が他の条件と連鎖することも防止されます。

if条件には、宣言ステートメントまたは式のいずれかを含めることができます。式に宣言ステートメントを含めることはできないため、それらを混在させることもできません。

[n3290: 6.4/1]:選択ステートメントは、複数の制御フローから 1 つを選択します。

selection-statement:
    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condition ) statement
condition:
    expression
    attribute-specifier-seq[opt] decl-specifier-seq declarator = initializer-clause
    attribute-specifier-seq[opt] decl-specifier-seq declarator braced-init-list

それはすべて、文法の生産から従います。

于 2011-09-24T18:53:33.133 に答える
0

条件で変数を宣言および初期化し、他の場所で宣言することとの違いは、変数が条件として使用され、if の条件ステートメント内ではスコープ内にあるが、その条件外ではスコープ外であるということです。また、if 条件内で変数を再宣言することは合法ではありません。そう

bool x=something();
if(x) {
    bool y=x; // legal, x in scope
    int x=3; // legal
    ...
}
while (x=something_else()) // legal, x still in scope
...

しかし:

if(bool x=something()) 
    bool y=x; // still legal
    int x=3; // not legal to redeclare
    ...
}
while (x=something_else()) // x declared in condition not in scope any more
于 2011-09-24T19:14:20.577 に答える