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

chr*_*irk 2 c++ variables const reference local

const std::string  s1("foo");
const std::string& s2("foo");
Run Code Online (Sandbox Code Playgroud)

不确定它们是如何不同但我看到两种用法的证据.有任何想法吗?

Jam*_*lis 6

const std::string s1("foo");
Run Code Online (Sandbox Code Playgroud)

这将命名std::string对象声明为局部变量.

const std::string& s1("foo");
Run Code Online (Sandbox Code Playgroud)

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

在这种特殊情况下,两者之间没有可观察到的差异:在这两种情况下,你最终会得到一个std::string可以通过名称访问的东西s1,并且当它s1超出范围时会被销毁.

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

const std::string& get_reference_to_string();
Run Code Online (Sandbox Code Playgroud)

如果s1使用调用此函数的结果进行初始化,则存在以下区别:

const std::string s1(get_reference_to_string());
const std::string& s1(get_reference_to_string());
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,引用字符串的副本并用于初始化s1.在第二种情况下,s1简单地绑定到std::string返回的引用所引用的内容:不进行复制.