读书人

C++标准有没有规定,对象构造完成之前能

发布时间: 2012-06-08 12:55:24 作者: rapoo

C++标准有没有规定,对象构造完成之前能否被引用?
如下的代码在GCC下面是可以编译运行的,输出120:

C/C++ code
struct Functor {      Functor &foo;      // not copy ctor,put "int" as dummy parameter      Functor(int, Functor &f):foo(f){}      int operator()(int x) const{ return (x < 2)? 1:x*foo(x-1);} }; int main(void){     Functor f(0, f);    printf("%d\n",f(5));    return 0; }

但是VC2010上面就会编译错误

f(0,f)里面的第二个f是未定义的。

为什么呢? 是VC不支持,还是说标准没有说能否这样用,看编译器的实现者。
请赐教!

[解决办法]
没看标准,不过感觉基本属于未定义行为,这样写代码有什么好处啊?

[解决办法]
int& f = f;
o O
[解决办法]
这样的行为应该是属于未定义的。
[解决办法]
你去看看标准上是怎么解释 int i=i;这样类似的代码吧
[解决办法]
应该是可以的。从实现的角度讲,如果是个指针,绝对可行,只要对象的空间已经被确定了。引用应该没什么区别。使用上只要注意不要在构造函数中去使用这个引用,是不会有什么问题的。

我也想知道vs2010返回的什么错?是个警告还是错误,或者是警告转化为错误?
[解决办法]
如果我没记错,是VC的错.

在定义之后,初始化列表之前,f就已经是可见的. 所以.这是可以的.
[解决办法]
探讨
如果我没记错,是VC的错.

在定义之后,初始化列表之前,f就已经是可见的. 所以.这是可以的.

[解决办法]
可以引用。
看你怎么用了。
使用interterminate value是UB。

[解决办法]
不能。
[解决办法]
在定义之后,初始化列表之前,f就已经是可见的

读书人网 >C++

热点推荐