构造对象时理解赋值中的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 constructor 以 const char*
作为参数。
接下来,左侧 的左值引用p
绑定到该临时对象。在这样做的过程中,临时文件的 lifetime 是 extended.
为了回答你的最后一个问题,你的程序中没有悬挂引用。
今天我看到这段代码,我想知道它在创建新对象的赋值中究竟做了什么这个 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 constructor 以 const char*
作为参数。
接下来,左侧 的左值引用p
绑定到该临时对象。在这样做的过程中,临时文件的 lifetime 是 extended.
为了回答你的最后一个问题,你的程序中没有悬挂引用。