[英]What's the difference between these two local variables?
const std::string s1("foo");
const std::string& s2("foo");
不确定它们是如何不同但我看到两种用法的证据。 有任何想法吗?
const std::string s1("foo");
这将一个名为std::string
对象声明为局部变量。
const std::string& s1("foo");
这声明了对std::string
对象的const引用。 使用内容"foo"
创建一个未命名的临时std::string
对象,并将引用绑定到该临时对象。 临时对象将存在,直到引用超出范围。
在这种特殊情况下,两者之间没有可观察到的差异:在两种情况下,你最终得到一个std::string
,可以通过名称s1
访问,当s1
超出范围时将被销毁。
但是,在某些情况下,存在差异。 例如,考虑一个通过引用返回的函数:
const std::string& get_reference_to_string();
如果使用调用此函数的结果初始化s1
,则存在以下区别:
const std::string s1(get_reference_to_string());
const std::string& s1(get_reference_to_string());
在第一种情况下,引用字符串的副本并用于初始化s1
。 在第二种情况下, s1
简单地绑定到返回引用所引用的std::string
:不进行复制。
它们的含义相同,因为常量引用可以绑定到temporaries以及具有char *隐式转换的字符串。
为了清晰和可读性,更喜欢非参考。
第一个实例创建一个常量字符串变量,初始化为“foo”。 第二个创建对字符串的常量引用,然后初始化该常量引用以指向初始化为保存“foo”的临时字符串。
const std::string s1("foo");
在堆栈上创建一个std::string
对象,并使用const char*
string“foo”对其进行初始化。 另一方面, const std::string& s1("foo")
是对隐式构造的std::string
的const引用 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.