C++中的变量名称不明确
Variables names ambiguity in C++
我对这种情况有点困惑:
#include <iostream>
void function(int origin)
{
if (origin < 0)
{
double origin = 0.3;
std::cout << origin << std::endl;
}
}
int main()
{
function(-4);
}
在v120工具集下使用VS2013成功编译并运行。这不是错误的C++吗因为做同样的事情,但只是在函数的开头,它会产生编译时错误。
根据C++标准第3.3.3.1节:,这是合法的
块中声明的名称是该块的本地名称;它具有块范围。它的潜在作用域从声明点开始,到块的末尾结束。在块范围内声明的变量是局部变量。
这样的重新声明会隐藏origin
参数。
因为做同样的事情,但只是在函数的开头,它会产生编译时错误。
您会得到一个错误,因为C++标准在第3.3.3.2:节中明确禁止这样的重新声明
参数名称不应在函数定义的最外层块中重新声明,也不应在与函数try块关联的任何处理程序的最外层区块中重新声明。
排除的原因是函数参数是函数外部作用域的本地参数,因此在没有另一层大括号的情况下进行重新声明会在同一作用域中引入重复的标识符。
我不介意这种C++行为。当然,正如您所展示的,它可能会导致错误/疏忽。但你可以在C++中做到这一点
for (int i = 0; i < 4; ++i) {
for (int i = 0; i < 5; ++i) {
cout << i;
}
cout << i;
}
cout << endl;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 5; ++j) {
cout << j;
}
cout << i;
}
并且由于CCD_ 2在内部CCD_。
在像C#这样的其他语言中,你不能这样做。它将告诉您已尝试在内部作用域中重新声明一个同名变量。
我觉得这太保护了。当我剪切和粘贴带有循环的代码时,必须将我们都倾向于用作循环变量的i
重新声明为i1
、i2
等,这是令人恼火的。我总是错过一个,剪切和粘贴代码,所以我在i3
循环中使用arr[i]
,而我指的是arr[i3]
(哇)。
在生产代码中,我同意防御性编码意味着您应该在同一函数中为循环变量使用不同的名称。
但是,当您进行实验时,能够在嵌套for循环中重用变量名是很好的。C++给了你这样的选择。
这不是错误的C++吗?
否。重新声明标识符是完全合法的,只要它在不同的范围内。在这种情况下,作用域是if语句的then主体。
这并不含糊。将使用最接近的先前声明。
不,没有错。根据标准,这是一种完全有效的行为。
void function(int origin)
{
if (origin < 0) // scope of the first 'origin'
{
double origin = 0.3; // scope of the second 'origin' begins
// scope of the first 'origin' is interrupted
std::cout << origin << std::endl;
} //block ends, scope of the second 'origin' ends
//scope of the first 'origin' resumes
}
正如tupe_cat所说,如果它们的作用域不同,那么重新声明总是有效的。在这种情况下,属于内部范围的变量将超过外部范围。
- 你能重载对象变量名本身返回的内容吗
- Visual C++(VS2017)中用户定义的转换不明确
- 在C/C++中将变量名定义为__00000001有什么好处吗
- 重载类方法的不明确调用
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 为函数定义符号不明确的指针参数
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 如何解决多次继承的不明确变量名称?
- 为什么继承的函数会更改基类中的成员变量,而不是与名为它的对象同名的对象
- 如何在从.txt文件中读取时不重复相同的变量名
- C++中的变量名称不明确
- 重载运算符'>>'的使用不明确(操作数类型'istream'(又名"basic_istream<char>")和"MyIncreEx")
- 为什么函数允许变量名和数据类型名,但关键字不允许
- Unicode和Clang中变量名中的特殊字符是不允许的吗
- 为什么我不能使用与类名相同的变量名?
- 使用Visual Studio 2010时,在将调试器附加到程序时看不到托管变量名
- 通常对函数名的非限定查找不同于对变量名的查找
- 不明确的注入类名不是错误