我有一个特定类A
的对象的std::vector
。该类是非常重要的,并且定义了复制构造函数和移动构造函数。
std::vector<A> myvec;
如果我用A
对象填充向量(例如使用myvec.push_back(a)
),向量会变大,使用复制构造函数A( const A&)
来实例化向量中元素的新副本。
我能以某种方式强制使用类A
的移动构造函数吗?
发布于 2013-03-15 03:12:50
有趣的是,如果move构造函数和析构函数都为noexcept
,则gcc 4.7.2的向量只使用move构造函数。一个简单的例子:
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();
}
这将输出预期的结果:
move
move
move
但是,当我从~foo()
中删除noexcept
时,结果是不同的:
copy
copy
copy
我猜这也回答了this question的问题。
https://stackoverflow.com/questions/8001823
复制相似问题