有人能解释一下这个C++引用的用法吗?

11

可能重复:
全局 const string& 让我感觉不好,它真的安全吗?

我偶然发现了以下代码并想知道它的优点。

std::string const & thestring( "XYZ" );

这是因为它正在构造对象并通过引用进行引用。我习惯于看到这样的操作。

std::string const theString( "XYZ" );

我想知道它们之间的区别。我相信这个对象不会被早期销毁,因为该对象与引用一起存在于堆栈上。


2
这个看起来相关:https://dev59.com/VXNA5IYBdhLWcg3wQ7m4#1028511 - perreal
我能想到的唯一区别是非引用的声明为const,从而const_cast去除const属性是未定义行为。 - PlasmaHH
@MatthieuM:我认为问题不在于安全性,而在于一个可能比另一个更有优势。 - PlasmaHH
@MatthieuM:由于临时变量也可以绑定到右值引用,因此我认为它没有“声明为const,因此const转换是UB”的属性。 - PlasmaHH
@PlasmaHH 去除 const 属性不是未定义行为。 - J.N.
显示剩余6条评论
1个回答

0

这完全取决于包含函数的字符串发生了什么。它需要被保存以供引用。

如果您在函数中有一个变量,该变量存在于函数所属的对象中。

class yourClass {
    string a; 

    string const & yourFunction(string b) {
        a = b;
        return a;
    }
}

此外,如果您直接返回“somestring”,不太确定会发生什么情况,但是当您使用inparameters进行类似操作时,它的工作方式如下:
void test(const string& value);

如果你传递的是"someString",它将不会被处理为引用,而只是一个值。如果你移除"const",你将会遇到麻烦,并且无法将"someString"作为一个值传递。


我认为你对const引用的理解有些模糊(或者说表述不够准确)。一个临时对象可以绑定到一个const&变量或函数参数上,此时临时对象的生命周期会延长至该引用的生命周期。但是这种方式无法用于返回值或类属性,因此你需要在那里使用一个命名对象。 - Matthieu M.
当然可以将“ofc i”绑定到“const&”,只是指在定义为“const&”时可以将纯字符串作为输入参数传递,而不能仅使用“&”.. 如果我理解有误,请纠正我。至于最后一件事,您的意思是什么?不确定我是否理解您的意思。 - chikuba
我的意思是,如果你在一个类中使用了一个 std::string const& 属性,你就不能将临时字符串绑定到它上面。 - Matthieu M.
不返回任何值时,不要返回“no”。我想我们在这方面是一致的。我真的看不出我哪里误解了什么。可能只是我的英语不好。 - chikuba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接