这会导致未定义的行为吗?

Sre*_*kel 2 c++ undefined

我在复制和找到错误的原因方面遇到了很大的问题.出现似乎是完全随机的,所以我怀疑某处有一个未初始化的变量.但后来我发现了这段代码:

CMyClass obj; // A
obj.DoStuff();

if ( somebool )
{
    CMyClass obj; // B
    obj.DoStuff();
}

obj.DoOtherStuff();
Run Code Online (Sandbox Code Playgroud)

似乎DoOtherStuff()要么在"B"上完成,要么B.DoStuff()有时实际上在A上工作 - 即我实际上在第一个obj上调用了DoStuff().

这会发生吗?我不认为我收到了编译器警告(我现在修改了代码,希望它可能有所帮助).看起来可能这段实际代码是我试图找到的bug的地方,但当然还有其他原因我尚未发现.

e.J*_*mes 5

编写的代码应该可以工作.第一次呼叫DoStuff()和最后一次呼叫DoOtherStuff()只能发送到A.

只能发送到块DoStuff()内的调用.if(somebool) { }B

标准:

3.3.2本地范围

  1. 块(6.3)中声明的名称是该块的本地名称.它的潜在范围从声明点(3.3.1)开始,到声明区域结束时结束.

和:

3.3.7名称隐藏

  1. 名称可以通过嵌套声明性区域或派生类(10.2)中相同名称的显式声明来隐藏.

话虽如此,也许这不是该代码作者的意图.如果变量具有相同的名称,则意图可能只有该变量的一个实例,并且B在循环内创建的实例是错误的.你是否经历过逻辑,看看第二个实例是否有意义?