关于临时对象,右值参数和push_back()(改)

sq6ra 2011-11-18 09:15:38
最近遇到这么一个问题..

class test {
public :
test() {
a = 100 ;
}
private :
int a ;
} ;

void main() {

deque<class test> container ;
container.push_back(class test()) ; //报错
class test t1 ;
container.push_back(t1) ; //正常
}

我参考了sgi的stl手册,得知push_back的参数为(const T&)
在报那一行里,临时的test对象不正是const 对象吗?为何对右值的引用无法正确传入push_back?

注意,这个做法在VS的编译器里貌似可行,但我昨晚用G++就不行了


我想知道为什么右值传不进去?请教原因,谢谢
...全文
284 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sq6ra 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zzcmx2008 的回复:]

另外,linux要求main函数返回int型
C/C++ code

int main() {

deque<class test> container ;
container.push_back(test()) ;
class test t1 ;
container.push_back(t1) ; //正常
return 0;
}
[/Quote]

收获了很多,谢谢你

我之前刚从微软的转到g++时,遇到类指针不加class旧报错,所以一只心有余悸

按照语法的时候加上class也没错...所以...

表达式里不放声明语句 学到了...

去除那个class后,可以了

这个问题的出现是我想在循环里push_back一个类型,所以用了临时对象
之前没谢const的copy constructor出了问题,然后又这个..

学到了...谢谢诸位的热心回答!

最后在分享下,最近在搞这个问题,发现貌似所有临时对象都是常量对象一类的,不加const就会有初始化类的错误


追求执着 2011-11-18
  • 打赏
  • 举报
回复
class test()改成 test()
zzcmx2008 2011-11-18
  • 打赏
  • 举报
回复
另外,linux要求main函数返回int型

int main() {

deque<class test> container ;
container.push_back(test()) ;
class test t1 ;
container.push_back(t1) ; //正常
return 0;
}


zzcmx2008 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sq6ra 的回复:]
引用 3 楼 zzcmx2008 的回复:

deque<class test> container ;
to
deque<test> container ; //一般这样写


你想说什么?把class去掉就能传进去?很明显这个不可能啊大哥,还有

我黑体标注了在VS里直接push_back右值是可以的,但是在标准c++编译器里不行,为想问为啥不是怎么改


在g++这个……
[/Quote]

很多书上都是直接deque<test> container ;这样声明的,包括c++ primer上面,不是说微软的才这样
zzcmx2008 2011-11-18
  • 打赏
  • 举报
回复
你的g++什么版本?
我给你的程序中,我用的g++ 4.3.3可以正常通过编译

另外
container.push_back(class test()) ; //报错
这句根本不会通过编译的的,应该为container.push_back(test()) ;

因为class test()不是声明类对象的语句,直接test()就可以了,test()也是声明一个临时对象的语句。
qq120848369 2011-11-18
  • 打赏
  • 举报
回复
楼主用的是上个世纪的g++.
jammychan 2011-11-18
  • 打赏
  • 举报
回复
container.push_back(class test()) ; //报错
这句话报错的原因应该是语法错误吧.vs不晓得.我也是用g++编译的,不过.
在C++中,声明一个类变量是不需要加class的,就好像
class test t1 ;
其实用test t1就可以了.当然这个没有报错.但是在一个表达式中,应该就不行了.
调用test()构造函数会返回一个test的临时变量,是可以push_back进去的.
所以改成
container.push_back(test());
这样子就可以了.
sq6ra 2011-11-18
  • 打赏
  • 举报
回复
有人知道么?

在g++里貌似凡是右值都不能传入容器的push型函数,contaniner.front()返回const_reference,也不能传入



container.push_back( containerB.front() )不行
而在vs上是可以的...


求解惑和梳理
sq6ra 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zzcmx2008 的回复:]

deque<class test> container ;
to
deque<test> container ; //一般这样写
[/Quote]

你想说什么?把class去掉就能传进去?很明显这个不可能啊大哥,还有

我黑体标注了在VS里直接push_back右值是可以的,但是在标准c++编译器里不行,为想问为啥不是怎么改


在g++这个编译器上,加class可以避免很多麻烦,微软的产品害死人

zzcmx2008 2011-11-18
  • 打赏
  • 举报
回复
deque<class test> container ;
to
deque<test> container ; //一般这样写
zzcmx2008 2011-11-18
  • 打赏
  • 举报
回复

#include <deque>
#include <iostream>

using namespace std;

class test {
public :
test() {
a = 100 ;
}
private :
int a ;
} ;

void main() {

deque<class test> container ;
container.push_back(test()) ;
class test t1 ;
container.push_back(t1) ; //正常
}


zzcmx2008 2011-11-18
  • 打赏
  • 举报
回复
container.push_back(class test()) ; //报错
container.push_back(test()) ;

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧