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

时间:2011-02-04 17:27:58

标签: c++ variables reference const local

const std::string  s1("foo");
const std::string& s2("foo");

不确定它们有何不同,但我看到两种用法的证据。有什么想法吗?

4 个答案:

答案 0 :(得分:6)

const std::string s1("foo");

这将一个名为std::string的对象声明为局部变量。

const std::string& s1("foo");

这声明了对std::string对象的const引用。使用内容std::string创建一个未命名的临时"foo"对象,并将引用绑定到该临时对象。临时对象将存在,直到引用超出范围。

在这种特殊情况下,两者之间没有可观察到的差异:在两种情况下,最终都会得到一个std::string,可以通过名称s1访问,而s1将在{{const std::string& get_reference_to_string(); 时被销毁1}}超出范围。

然而,在某些情况下,存在差异。例如,考虑一个通过引用返回的函数:

s1

如果您使用调用此函数的结果初始化const std::string s1(get_reference_to_string()); const std::string& s1(get_reference_to_string()); ,则存在以下区别:

s1

在第一种情况下,引用字符串的副本并用于初始化s1。在第二种情况下,std::string仅绑定到返回引用所引用的{{1}}:不进行复制。

答案 1 :(得分:3)

它们的含义相同,因为常量引用可以绑定到temporaries以及具有char *的隐式转换的字符串。

为了清晰和可读性,请选择非参考。

答案 2 :(得分:0)

第一个实例创建一个常量字符串变量,初始化为“foo”。第二个创建一个对字符串的常量引用,然后初始化该常量引用以指向一个初始化为保存“foo”的临时字符串。

答案 3 :(得分:0)

const std::string s1("foo");在堆栈上创建一个std::string对象,并使用const char*字符串“foo”对其进行初始化。另一方面,const std::string& s1("foo")是隐式构造的std::string const引用

相关问题