在函数参数中分配/初始化引用

Assigning/Initializing references in function args

本文关键字:初始化 引用 分配 函数 参数      更新时间:2023-10-16

我来自C背景,正试图理解这意味着什么:

void f(const string &x = "hello") {
}

如果没有传入任何内容,x是否设置为默认值?"你好"住在哪里?

您的参数(x)是在调用函数的上下文中创建/初始化的。字符串文字"hello"具有静态存储持续时间。

该标准没有指定存储这两种类型的内存的形式,但在典型情况下,字符串文字将驻留在一些直接从可执行文件中的数据初始化的内存中,并且x将在堆栈上创建(如果不在其位置传递其他内容,则传递文字的地址来初始化它)。

它被称为默认参数,如果您访问此链接,您将了解这些参数。

默认参数是具有默认值的函数参数提供给它。如果用户没有为此提供值参数,将使用默认值。如果用户提供值,则使用用户提供的值。

所以,如果你这样调用f-

f();

那么x将包含hello,但如果你这样称呼它-

f("test");

则CCD_ 6将包含CCD_。

该参数声明等效于以下更明确的一个

void f(const string &x = string("hello")) 

您是正确的:当函数在没有显式参数的情况下调用时,会使用=之后的部分(即所谓的默认参数),如中

f();

在这种情况下,string类型的临时对象由"hello"初始化器构造,然后用作引用x的初始化器。该临时调用的构造是在调用代码的上下文中执行的,这意味着上述调用等效于

f(string("hello"));

为了回答您关于"hello"的问题:"hello"是一个具有静态存储持续时间的字符串文字(即,它驻留在静态内存中,就像在C中一样)。但是,请再次注意,在本例中,并不是"hello"本身用作引用的初始值设定项。在这种情况下,编译器将隐式地为此目的创建一个短暂的无名称临时string对象,正如我在上面的示例中明确指出的那样。