下面这段C++代码能够在VS2008里面编译通过。
class A{}; int main(){ A& a_ref = A(); return 0; }
我认为A()是一个临时对象,不能够用来初始化non-const的对象。
可这段代码在VS2008里面能够编译通过,为什么呢?
这是不符合C++标准的,属于VS系列编译器对于C++标准的扩展。
可以使用/Za编译选项把这些扩展关掉,然后VS编译器就会报错了。
A()返回一个A的对象,为什么不能?
谁说可以,gcc就会报错
invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A
如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。
临时变量应该是不可以修改的,为什么能被non-const 的引用呢?
你的语句相当于:
A tmp;
A& a=tmp;
铁定不是,tmp是个局部变量
@嗷嗷: 为什么这么铁定的认为不是呢?tmp一般用于临时变量的命名定义,不过是一个名字而已。你想怎么弄就怎么弄。我改成:
A a;
A& a_ref = a;
这样是否可行呢?
@笨笨蜗牛:
A a
A& a_ref = a
当然可以了,a是个局部变量。可是 A(),返回的是一个临时对象(temporary object),是不一样的
@嗷嗷: A()就是构造一个类型为A的对象。
A& a_ref = A()
就是构造一个A的对象赋值给a_ref变量。别在这个临时变量上较真。
@笨笨蜗牛: 你连啥是temporary object都不知道,就别掺和了。这代码在gcc里面是会报错的,invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A
@嗷嗷: 确实是不知道,只是凭感觉给你回答。我没用过GCC,用的VC也是N年前的事情了。
vs2005也能通过。
答案很简单,就是vc++没有按照c++标准来实现。地球人都知道ms最不鸟标准啦。
不过在这一点上貌似IBM家的那什么也是这么实现的。
个人赞同ms和ibm家的实现。反正都已经延长临时变量的声明周期,何苦只是在编译阶段区分一下const还是非const呢。
这里是和编译器的处理相关的,例如char* a="test"; 字符串"test"是字符串直接量,a会被处理为const char*,虽然没有明确的写明a的const属性。