考虑一个函数原型:
void foo(const std::string& str);
如果我用const char*
这样称呼它:
const char buffer[] = "Hello World!";
foo(buffer);
它会创建数据的深层副本吗?或者它会是一个肤浅的复制品?
它会创建数据的深度副本吗?或者它会是一个肤浅的复制品?
它将构造一个临时std::string
对象,该对象将字符从char[]
深度复制到std::string
中。
复制与否在这里并没有真正的意义。
构造临时std::string
并将其传递给函数(作为常量引用(。
(结果buffer
被复制到std::string
内部缓冲器。(
您也可以传递std::string_view
,这样就不会有副本。
void foo(const std::string_view& str);
它会创建数据的副本吗?
您正在传递的char*
可用于使用构造函数创建临时std::string
basic_string( const CharT* s,
const Allocator& alloc = Allocator() );
但是该对象的值类别将是CCD_ 11,其不能绑定到非常值左值引用。这意味着,给定的示例将不起作用,因为非常量左值引用无法绑定到右值。
为了解决这个问题,你可以在函数的参数中添加一个低级常量,比如:
//-------vvvvv--------------------->low level const added
void foo(const std::string& str);
这是因为常量左值引用可以绑定到右值。