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

Understanding const reference in assignment when constructing object

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

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

我知道 std::string const& p = s; 之类的东西会创建对 s 的引用 p,但是在显示的行中我们正在创建一个新对象(使用来自 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 const& p = s.c_str();

没有本质区别
std::string const p( s.c_str() );

但更令人困惑。

至于这个语句的输出

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

然后输出了两个不同的地址。第一个是参数s的地址,第二个是在这个声明中创建的std::string类型的临时对象的地址

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

通过转换构造函数

basic_string(const charT* s, const Allocator& a = Allocator());

std::string::c_str's documentation开始,returns:

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 绑定到该临时对象。在这样做的过程中,临时文件的 lifetimeextended.

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