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就已经是可见的. 所以.这是可以的.
[解决办法]
[解决办法]
可以引用。
看你怎么用了。
使用interterminate value是UB。
[解决办法]
不能。
[解决办法]
在定义之后,初始化列表之前,f就已经是可见的