const std::string s1("foo");
const std::string& s2("foo");
不确定它们有何不同,但我看到两种用法的证据。有什么想法吗?
答案 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引用。