为什么这段代码格式正确?我没有传递对函数的引用:
void function(const int& ref) {
}
int main()
{
function(1);
}
答案 0 :(得分:6)
常量左值引用可以绑定到右值。 Rvalues与您的文字1
一样,不具有持久性别名,因此如果您要修改它,您将无法观察到效果,但如果您承诺不修改它(即通过不断引用访问它),你仍然可以拥有完全合理的代码,这就是允许这种绑定的原因。
(您还可以将rvalues绑定到(mutable) rvalue references :void function(int &&)
在这种情况下,rvalue引用将成为值的(唯一)别名。)
另请注意,如果没有此规则,则无法从返回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
答案 1 :(得分:2)
编译器可以从常量创建临时值,并允许临时值绑定到const引用。如果引用不是常量,则不允许这样做。