我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?
Vector的新方法data()提供了const和非const版本.
但是string的data()方法只提供const版本.
我认为他们改变了措辞,std::string以便现在要求chars连续(比如std::vector).
当时std::string::data只是错过了什么?或者是一个很好的理由只允许const访问字符串的底层字符?
注意:std::vector::data有另一个很好的功能,调用data()空向量不是未定义的行为.尽管&vec.front()是不确定的行为,如果它是空的.
考虑以下类,实现移动构造函数的正确方法是什么:
class C {
public:
C();
C(C&& c);
private:
std::string string;
}
Run Code Online (Sandbox Code Playgroud)
当然,这个想法是避免复制string或解除分配两次.
让我们假设基本的例子只是为了清晰,我确实需要一个移动构造函数.
我试过了:
C::C(C&& c) {
//move ctor
string = std::move(c.string);
}
Run Code Online (Sandbox Code Playgroud)
和
C::C(C&& c) : string(std::move(c.string)) {
//move ctor
}
Run Code Online (Sandbox Code Playgroud)
两者都在gcc 4.8上编译正常并运行良好.这似乎选项A是正确的行为,string被复制,而不是使用选项B.移动
这是正确执行的举动构造的?
有没有办法将内容从std :: string移动到std :: vector?我认为现在在语言中使用rvalue-references,这个操作有时非常有用.