作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么第一个注释行编译正确,而第二个没有?
为什么a
可以作为构造函数参数给自己,而b
不能?
这两个不是在做同样的事情吗?
class Foo { Foo &operator =(Foo const &); /* Disable assignment */ };
int main()
{
Foo a = a; // OK
Foo b(b); // error C2065: 'b' : undeclared identifier
}
由于它似乎是依赖于编译器的,因此问题似乎比我想象的要严重。
所以我想问题的另一部分是,以下代码是否有效?
它在 GCC 中给出了错误,但 Visual C++ 执行得很好。
int main()
{
int i = 0;
{ int *i(&i); }
return i;
}
最佳答案
在您的第一个代码中,两个声明都应该编译。海湾合作委员会就在那里。 Visual C++ 编译器有错误。
在第二个代码中,内部声明应该不编译。 GCC也对,VC++错了。
GCC 在这两种情况下都是正确的。
像 int a=a+100;
和 int a(a+100);
这样的代码从语法的角度来看是好的.它们可能会调用未定义的行为,具体取决于它们是在静态存储期限 还是自动存储期限 中创建的。
int a = a + 100; //well-defined. a is initialized to 100
//a on RHS is statically initialized to 0
//then a on LHS is dynamically initialized to (0+100).
void f()
{
int b = b + 100; //undefined-behavior. b on RHS is uninitialized
int a = a + 50; //which `a` is on the RHS? previously declared one?
//No. `a` on RHS refers to the newly declared one.
//the part `int a` declares a variable, which hides
//any symbol with same name declared in outer scope,
//then `=a+50` is the initializer part.
//since a on RHS is uninitialized, it invokes UB
}
请阅读与上述每项声明相关的评论。
请注意,具有静态存储持续时间 的变量在编译时静态初始化为零,如果它们有初始化器,那么它们也会在运行时动态初始化。但是具有自动存储期限的 POD 类型的变量不会被静态初始化。
有关静态初始化与动态初始化的更多详细说明,请参阅:
关于c++ - 与显式初始化相比,了解 C++ 中的复制初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14640498/
我是一名优秀的程序员,十分优秀!