容器的inser操作和emplace操作

C++语言 码拜 9年前 (2016-04-20) 1246次浏览
	vector<unique_ptr<char[]>> vecStr;
	vecStr.emplace_back(new char[10]());	           //合法
	vecStr.insert(vecStr.begin(), new char[10]());    //合法

1.书上说inset操作是按值拷贝,那么理论上是不会主动去构造元素,那么上述inser语句应该是错误的,为什么能正确执行
2.若inser操作也会构造元素,那么emplace操作和inser操作有什么区别
以上2个问题,望解答

解决方案

5

lz用的什么编译器,居然第二个合法?
[code]prog.cpp: In function “int main()”:
prog.cpp:8:49: error: no matching function for call to “std::vector<std::unique_ptr<char []> >::insert(std::vector<std::unique_ptr<char []> >::iterator, char*)”
vecStr.insert(vecStr.begin(), new char[10]());[/code]
std::vector::insert
可以看出没有一个可以匹配

5

vecStr.insert(vecStr.begin(), new char[10]());

本人运行这句是会报错的。得改为:

vecStr.insert(vecStr.begin(),unique_ptr<char[]>(new char[10]));

5

就算vs2015也不是完全支持c++11标准, 2010本人记得当初实现的c++11最基本的一批标准(像是nullptr这些简单的),
要用c++11就扔了吧,要用新标准就一直用最新的版本

10

引用:
Quote: 引用:

emplace是就地构造,之后不用再去调用复制构造函数了
http://en.cppreference.com/w/cpp/container/vector/insert
http://en.cppreference.com/w/cpp/container/vector/emplace

本人的意思是第二句insert语句从语法上来说是不是错的

这取决于你的unique_ptr构造函数定义,假如有explicit关键词,则不能实现这个转换,也就是说会无法通过编译


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明容器的inser操作和emplace操作
喜欢 (0)
[1034331897@qq.com]
分享 (0)