将整数传递给要求引用的函数

7
为什么这段代码是格式良好的?我没有向函数传递引用:
void function(const int& ref) {

}

int main()
{
    function(1);
}

5
函数参数签名中的 const 关键字可以让你实现这样的功能。如果省略它,就会出错。 - πάντα ῥεῖ
2个回答

6

常量左值引用可以绑定到右值。像您的文字“1”一样的右值没有持久的别名,因此如果您要修改它,您将无法观察到效果,但是如果您承诺不修改它(即通过常量引用访问它),仍然可以拥有完全合理的代码,这就是为什么允许此绑定的原因。

(您还可以将右值绑定到(可变)右值引用void function(int &&) 在这种情况下,右值引用成为该值的(唯一)别名。)

还请注意,如果没有这个规则,从返回prvalues的函数初始化变量或根本不能使用复制初始化将是不可能的:

struct T { T(int); };

T f();

T x = 1;     // ===  "T x = T(1);", copy constructor wants to bind to prvalue
T x = f();   // ditto
T x((f()));  // ditto

我不理解最后这个“复制初始化”与“能够将常量左值引用与右值绑定”之间的联系。我认为T(int)应该是T(const int&)。 - Dean
@user3834459:不,那里的 int 和你的 int 没有任何关系。在这个例子中,T 值是 prvalue。 - Kerrek SB
我就是不明白复制初始化和我刚提出的问题有什么关系。 - Dean

2
编译器可以从常量中创建临时对象,并且临时对象可以绑定到const引用。如果引用不是const的,这将是不允许的。

可怜的编译器并不想参与这个讨论。它只是按照语言规则在执行 :-( - Kerrek SB
@KerrekSB 好的,编译器可以创建一个临时变量并将其绑定到非const引用,但它不会这样做,因为语言规则告诉它不要这样做。;) - David Schwartz

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