C++ 中的移动语义和 R 值引用弦乐构造
C++11 是否会在参数字符串构造中移动语义和右值引用(例如
do_something_with_string(std::string("abc"))
假设声明),
void do_something_with_string(const std::string &);
从而可以防止 "abc"
的冗余堆复制?
如果是这样,它是否会不必要地使用 boost::const_string
中的 const char
包装器 boost::cref
?
Will C++11 move semantics and r-value references in argument string constructs such as
do_something_with_string(std::string("abc"))
assuming declaration for example
void do_something_with_string(const std::string &);
make it possible to prevent the redundant heap-copying of "abc"
?
If so will it make use of the const char
wrapper boost::cref
in boost::const_string
unneccesary?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你不能这样移动数据。
const_string
具有const char*
重载的原因是const_string
是 const。它的设计是不可变的。因此,它可以存储通过引用也是不可变的常量字符串,例如 const char*:字符串文字。std::string
不是不可变的。即使您在其整个生命周期中仅通过 const& 来保存它,它仍然不是一个不可变的字符串。因此,它必须从 const char* 复制到自己的私有缓冲区中。You can't move data like that. The reason
const_string
has that overload forconst char*
is becauseconst_string
is const. It is immutable by its design. Therefore, it can store constant strings which are also immutable by reference, like aconst char*
: a string literal.std::string
is not immutable. Even if you only hold it byconst&
for the entire duration of its life, it is still not an immutable string. Therefore, it must copy from aconst char*
into its own private buffer.