首页 新闻 搜索 专区 学院

C++为什么临时对象能够赋值给引用?

0
悬赏园豆:100 [已解决问题] 解决于 2012-09-14 14:36

下面这段C++代码能够在VS2008里面编译通过。

class A{};

int main(){
    A& a_ref = A(); 
    return 0;
}

我认为A()是一个临时对象,不能够用来初始化non-const的对象。

可这段代码在VS2008里面能够编译通过,为什么呢?

c++
嗷嗷的主页 嗷嗷 | 小虾三级 | 园豆:557
提问于:2012-06-07 15:09
< >
分享
最佳答案
0

这是不符合C++标准的,属于VS系列编译器对于C++标准的扩展。
可以使用/Za编译选项把这些扩展关掉,然后VS编译器就会报错了。

收获园豆:100
眯妖 | 小虾三级 |园豆:820 | 2012-09-14 14:32
其他回答(5)
0

A()返回一个A的对象,为什么不能?

56180825 | 园豆:1468 (小虾三级) | 2012-06-07 15:24

谁说可以,gcc就会报错

invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A

支持(0) 反对(0) 嗷嗷 | 园豆:557 (小虾三级) | 2012-06-07 16:21
0

如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。

悟行 | 园豆:12371 (专家六级) | 2012-06-07 15:32

临时变量应该是不可以修改的,为什么能被non-const 的引用呢?

支持(0) 反对(0) 嗷嗷 | 园豆:557 (小虾三级) | 2012-06-07 16:22
0

你的语句相当于:

A tmp;

A& a=tmp;

无之无 | 园豆:5085 (大侠五级) | 2012-06-07 15:55

铁定不是,tmp是个局部变量

支持(0) 反对(0) 嗷嗷 | 园豆:557 (小虾三级) | 2012-06-07 16:22

@嗷嗷: 为什么这么铁定的认为不是呢?tmp一般用于临时变量的命名定义,不过是一个名字而已。你想怎么弄就怎么弄。我改成:

A a;

A& a_ref = a;

 

这样是否可行呢?

支持(0) 反对(0) 无之无 | 园豆:5085 (大侠五级) | 2012-06-07 16:29

@笨笨蜗牛: 

A a

A& a_ref = a

当然可以了,a是个局部变量。可是  A(),返回的是一个临时对象(temporary object),是不一样的

支持(0) 反对(0) 嗷嗷 | 园豆:557 (小虾三级) | 2012-06-07 16:36

@嗷嗷: A()就是构造一个类型为A的对象。

A& a_ref = A()

就是构造一个A的对象赋值给a_ref变量。别在这个临时变量上较真。

支持(0) 反对(0) 无之无 | 园豆:5085 (大侠五级) | 2012-06-07 17:28

@笨笨蜗牛: 你连啥是temporary object都不知道,就别掺和了。这代码在gcc里面是会报错的,invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A

支持(0) 反对(0) 嗷嗷 | 园豆:557 (小虾三级) | 2012-06-07 20:44

@嗷嗷:  确实是不知道,只是凭感觉给你回答。我没用过GCC,用的VC也是N年前的事情了。

支持(0) 反对(0) 无之无 | 园豆:5085 (大侠五级) | 2012-06-08 08:30
0

vs2005也能通过。

答案很简单,就是vc++没有按照c++标准来实现。地球人都知道ms最不鸟标准啦。

不过在这一点上貌似IBM家的那什么也是这么实现的。

mumuliang | 园豆:213 (菜鸟二级) | 2012-06-08 10:08

个人赞同ms和ibm家的实现。反正都已经延长临时变量的声明周期,何苦只是在编译阶段区分一下const还是非const呢。

支持(0) 反对(0) mumuliang | 园豆:213 (菜鸟二级) | 2012-06-08 10:15
0

这里是和编译器的处理相关的,例如char* a="test"; 字符串"test"是字符串直接量,a会被处理为const char*,虽然没有明确的写明a的const属性。

zsounder | 园豆:2819 (老鸟四级) | 2012-06-12 12:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册