C++ 在控制结构中定义变量

C++ 在控制结构中定义变量,c++,iso,control-structure,C++,Iso,Control Structure,根据标准,在控制结构中声明变量与在其他地方声明变量在行为上有什么区别?我似乎找不到任何提及此事的地方 如果我指的不是很清楚,下面是一个例子: if (std::shared_ptr<Object> obj = objWeakPtr.lock()) 根据标准,在控制结构中声明变量与在其他地方声明变量在行为上有什么区别?我似乎找不到任何提及此事的地方 控件结构介绍中的声明与其他地方的声明没有什么不同。这就是为什么你找不到任何差异 6.4/3确实对此描述了一些特定的语义,但没有令人惊讶的

根据标准,在控制结构中声明变量与在其他地方声明变量在行为上有什么区别?我似乎找不到任何提及此事的地方

如果我指的不是很清楚,下面是一个例子:

if (std::shared_ptr<Object> obj = objWeakPtr.lock())
根据标准,在控制结构中声明变量与在其他地方声明变量在行为上有什么区别?我似乎找不到任何提及此事的地方

控件结构介绍中的声明与其他地方的声明没有什么不同。这就是为什么你找不到任何差异

6.4/3确实对此描述了一些特定的语义,但没有令人惊讶的地方:

[n3290:6.4/3]:
由条件中的声明引入的名称 (由类型说明符seq或 条件)从其声明点到 由条件控制的子状态。如果名字是 在由控制的子状态的最外层块中重新声明 条件,则重新声明名称的声明格式错误。[……]


另外,有没有什么技术上的原因来解释为什么这个语法在代替条件语法时没有给出任何特殊的行为?例如,添加一组额外的括号会导致编译器错误;这还可以防止变量与其他条件链接

// 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())
if
条件可以包含声明性语句或表达式。任何表达式都不能包含声明性语句,因此也不能混合使用它们

[n3290:6.4/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
这一切都是从语法产物中衍生出来的

根据标准,在控制结构中声明变量与在其他地方声明变量在行为上有什么区别?我似乎找不到任何提及此事的地方

控件结构介绍中的声明与其他地方的声明没有什么不同。这就是为什么你找不到任何差异

6.4/3确实对此描述了一些特定的语义,但没有令人惊讶的地方:

[n3290:6.4/3]:
由条件中的声明引入的名称 (由类型说明符seq或 条件)从其声明点到 由条件控制的子状态。如果名字是 在由控制的子状态的最外层块中重新声明 条件,则重新声明名称的声明格式错误。[……]


另外,有没有什么技术上的原因来解释为什么这个语法在代替条件语法时没有给出任何特殊的行为?例如,添加一组额外的括号会导致编译器错误;这还可以防止变量与其他条件链接

// 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())
if
条件可以包含声明性语句或表达式。任何表达式都不能包含声明性语句,因此也不能混合使用它们

[n3290:6.4/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

这一切都源自语法结果。

在条件中声明和初始化变量与在其他地方声明变量的区别在于,变量用作条件,并且在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的条件语句内的范围内,但在该条件外的范围外。此外,在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
...
但是:


很多用户没有(或不能使用)使用新标准的编译器。此语法在C++03中是非法的。也就是说,某些语法在C++03中是非法的。C++11添加了
带括号的init列表
。好的,但结论是正确的。很多用户没有(或不能使用)使用新标准的编译器。此语法在C++03中是非法的。也就是说,某些语法在C++03中是非法的。C++11添加了带括号的init列表。好的,但结论是正确的。括号没有什么特别之处。这也是非法的:
for((intii=0);ii<42;++ii){…}
。有时,添加明显多余的括号会将有效语法更改为无效语法。这里的括号没有什么特别之处。这也是非法的:
for((intii=0);ii<42;++ii){…}
。有时添加明显多余的括号会将有效语法更改为无效语法。