繁体   English   中英

这两个局部变量之间有什么区别?

[英]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::stringconst引用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM