【发布时间】:2013-01-16 10:09:08
【问题描述】:
为什么注释的第一行编译正确,而第二行编译不正确?
为什么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;
}
【问题讨论】:
-
在 GCC 4.7.2 和 Clang 3.2 上都可以工作(错误)。
-
@chris:哦,奇怪,我用的是 Visual C++。那么,哪一个是对的?!
-
我不确定,但我几乎每天都会猜测 GCC 和 Clang 而不是 MSVC。至少它缩小了问题的范围。
-
实际上两者都应该编译。从语法的角度来看,像
int a=a+100;和int a(a+100);这样的代码很好。它们可能会调用 UB,具体取决于它们是在静态存储期限内创建还是在自动存储期限内创建。 -
赋值运算符与示例中的任何内容有什么关系?而且我永远不会将其描述为“严重”,因为它只会影响非常愚蠢的代码。
标签: c++ constructor initialization