f({1, 3})与f(C c)和`f(const C c)
#include <iostream>using namespace std;struct C {int x;int y;
};void f(const C &c) {cout << c.x << ' ' << c.y << endl;
}int main() {f({1, 3});return 0;
}
解释
1. f(const C &c)
可以编译
在 f(const C &c)
的定义中,const C &c
是一个对 C
类型的 const
引用。这意味着你可以将一个 C
对象传递给 f
函数而不会进行拷贝,同时在函数内部不会修改这个对象。这种做法非常适合用于处理临时对象,因为函数不会修改传入的对象。
2. f(C &c)
无法编译
在 f(C &c)
的定义中,C &c
是一个对 C
类型的非 const
引用。这要求在调用 f
时传入一个已经存在的 C
对象,因为引用必须绑定到一个可修改的对象上。然而,f({1, 3});
试图将一个临时对象传递给 f
。临时对象(即匿名对象)是不能绑定到一个非 const
引用上。临时对象是不可修改的,因此 C &c
不允许将其绑定到一个临时对象上。
3. 临时对象与引用
在 C++ 中:
- 常量引用:
const C &
可以绑定到一个临时对象,因为它不会尝试修改对象。编译器允许这种绑定。 - 非常量引用:
C &
不能绑定到临时对象,因为它可能尝试修改对象,而临时对象不能被修改。