gpt4 book ai didi

c++ - 构造对象时理解赋值中的const引用

转载 作者:行者123 更新时间:2023-12-05 09:29:14 24 4
gpt4 key购买 nike

今天我看到这段代码,我想知道它在创建新对象的赋值中究竟做了什么这个 const 引用。 (我不知道如何命名这种作业。)

std::string const& p = s.c_str(); // s is a std::string

我知道像 std::string const& p = s; 这样的东西会创建一个 ps 的引用,但是在行中显示我们正在创建一个新对象(使用来自 std::string::c_str 的原始指针)。

我在 Coliru 中制作了一个 MCVE有了这个:

#include <iostream>
#include <string>

void foo(std::string const& s)
{
std::string const& p = s.c_str(); // << here

std::cout << s << " " << p << " " << &s << " " << &p << std::endl;
}

int main()
{
foo("hello");
}

而且,正如预期的那样,输出显示创建了一个新对象:

hello hello 0x7ffdd54ef9a0 0x7ffdd54ef950

所以,我的问题是:这是否真的在做一些我看不到的事情?代码中是否存在任何问题(如悬挂引用)?

最佳答案

来自 std::string::c_str's documentation ,它返回:

a pointer to an array that contains a null-terminated sequence of characters (i.e., a C-string) representing the current value of the string object. That is, a const char*.

所以当你写的时候:

std::string const& p = s.c_str();

在上面的语句中,右侧 返回的const char* 用于创建类型为临时 的对象std::string 使用 converting constructorconst char* 作为参数。

接下来,左侧 的左值引用p 绑定(bind)到该临时对象。这样做可以延长临时文件的生命周期

要回答您的最后一个问题,您的程序中没有悬挂引用。

关于c++ - 构造对象时理解赋值中的const引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70752912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com