函数参数 const str::string&在函数收到 const char* 时是否创建深层副本?



考虑一个函数原型:

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);

这是因为常量左值引用可以绑定到右值。

最新更新