const引用的文字初始化

Nik*_*ale 18 c++ variables initialization reference

以下代码如何在C++中工作?这合乎逻辑吗?

const int &ref = 9;
const int &another_ref = ref + 6;
Run Code Online (Sandbox Code Playgroud)

为什么当非const引用不允许C++时,C++允许对const引用进行文字初始化?例如:

const int days_of_week = 7;
int &dof = days_of_week; //error: non const reference to a const object
Run Code Online (Sandbox Code Playgroud)

这可以通过以下事实来解释:非const引用可用于更改它所引用的变量的值.因此,C++不允许对const变量进行非const引用.

这可能是一个可能的解释吗?C++不允许:

int &ref = 7;
Run Code Online (Sandbox Code Playgroud)

因为这不符合逻辑,但是:

const int &ref = 7;
Run Code Online (Sandbox Code Playgroud)

几乎相当于:

const int val = 7;
Run Code Online (Sandbox Code Playgroud)

因此,const变量允许进行文字初始化.

PS:我正在研究Lippman的C++入门.

小智 11

所以你可以写这样的代码:

void f( const string & s ) {
}

f( "foobar" );
Run Code Online (Sandbox Code Playgroud)

虽然严格来说这里实际发生的事情并不是文字被绑定到const引用 - 而是创建了一个temprary字符串对象:

string( "foobar" );
Run Code Online (Sandbox Code Playgroud)

这个无名字符串绑定到引用.

请注意,创建非参数引用变量实际上是非常不寻常的 - 引用的主要目的是充当函数参数和返回值.


小智 11

可以使用文字和临时值初始化常量引用,因为您可以将它们简单地转换为显式变量:

int const& ans = 42;
// tranformed:
int __internal_unique_name = 42;
int const& ans = __internal_unique_name;
Run Code Online (Sandbox Code Playgroud)

或者在未延长生命周期时,例如函数参数:

f("foobar");
// transformed:
{
  string __internal_unique_name = "foobar";
  f(__internal_unique_name);
}
Run Code Online (Sandbox Code Playgroud)

(注意这种情况下的显式块.)

虽然在非常数情况下可以做类似的事情,但这在当前的C++中是不允许的.但是,C++ 0x(下一个标准)将具有r值引用.


如果不清楚,ref + 6则从您的代码中创建一个临时对象,您可以将其视为:

int const& ref = int(9);
int const& another_ref = int(ref + 6);

// transformed:
int __A = 9;
int const& ref = __A;
int __B = ref + 6;
int const& another_ref = __B;
Run Code Online (Sandbox Code Playgroud)

这可能有助于您理解/可视化正在发生的事情,但您不应该编写这样的真实代码.此外,我使用双下划线名称来说明这些名称是实现细节(由编译器使用),不应该被您使用.包含相邻下划线的任何名称都保留给C++实现.