首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当向量增长时,如何执行移动语义?

当向量增长时,如何执行移动语义?
EN

Stack Overflow用户
提问于 2011-11-04 05:03:27
回答 1查看 19.1K关注 0票数 101

我有一个特定类A的对象的std::vector。该类是非常重要的,并且定义了复制构造函数和移动构造函数。

代码语言:javascript
复制
std::vector<A>  myvec;

如果我用A对象填充向量(例如使用myvec.push_back(a)),向量会变大,使用复制构造函数A( const A&)来实例化向量中元素的新副本。

我能以某种方式强制使用类A的移动构造函数吗?

EN

回答 1

Stack Overflow用户

发布于 2013-03-15 03:12:50

有趣的是,如果move构造函数和析构函数都为noexcept,则gcc 4.7.2的向量只使用move构造函数。一个简单的例子:

代码语言:javascript
复制
struct foo {
    foo() {}
    foo( const foo & ) noexcept { std::cout << "copy\n"; }
    foo( foo && ) noexcept { std::cout << "move\n"; }
    ~foo() noexcept {}
};

int main() {
    std::vector< foo > v;
    for ( int i = 0; i < 3; ++i ) v.emplace_back();
}

这将输出预期的结果:

代码语言:javascript
复制
move
move
move

但是,当我从~foo()中删除noexcept时,结果是不同的:

代码语言:javascript
复制
copy
copy
copy

我猜这也回答了this question的问题。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8001823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档