根据标准,在控制结构中声明变量与在其他地方声明变量之间的行为有何不同?我似乎无法找到它。
如果我所指的不清楚,这是一个例子:
if (std::shared_ptr<Object> obj = objWeakPtr.lock())
如您所见,我在if块中声明并初始化局部变量obj
。
此外,有什么技术原因可以解释为什么在使用这种语法代替条件时没有给出任何特殊行为?例如,添加一组额外的括号会导致编译器错误;这也可以防止变量与其他条件链接。
// 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())
答案 0 :(得分:3)
根据标准,在控制结构中声明变量与在其他地方声明变量之间的行为有何不同?我似乎无法找到它。
控制结构介绍中的声明与其他地方的声明没有什么不同。这就是为什么你找不到任何差异。
6.4 / 3确实描述了一些特定的语义,但没有任何意外:
[n3290: 6.4/3]:
条件中声明引入的名称 (由 type-specifier-seq 或者声明者引入 条件)从声明的范围到结束 由条件控制的子语句。如果名字是 重新声明在受控制的子语言的最外层 条件,重新声明名称的声明是不正确的。 [..]
此外,有什么技术原因可以解释为什么在使用这种语法代替条件时没有给出任何特殊行为?例如,添加一组额外的括号会导致编译器错误;这也可以防止变量与其他条件链接。
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
这一切都来自语法作品。
答案 1 :(得分: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