为什么临时对象可以绑定到常量引用?
why can temporary objects be bound to const reference?
问题来源:
唯一失败的情况是通过非常量引用传递参数, 因为临时变量无法绑定到它。
void DrawLine(const Vector& v1, const Vector& v2);
如果对象是临时的,为什么使引用const
会对临时对象的生存期产生任何影响?
我想我也不完全理解在参数中创建的临时对象的存在范围。
如果对象是临时的,为什么引用
const
会对临时对象的生存期产生任何影响?
在当前上下文中,问题不在于对象的生存期,而在于是否可以修改它。
假设你打了一个电话。
foo(10);
函数不应修改调用中保存值10
的对象。如果foo
的接口是:
void foo(int& ref);
将foo
实现为:
void foo(int& ref)
{
ref = 20;
}
鉴于呼叫foo(10)
,这将是一个问题。如果foo
使用const&
,那将不是问题。
void foo(int const& ref)
{
ref = 20; // Not allowed.
}
从 C++11 标准、临时对象/1
类类型的临时变量是在各种上下文中创建的:绑定对 prvalue 的引用 ([dcl.init.ref])、返回 prvalue ([stmt.return])、创建 prvalue 的转换......
以及来自 C++11 标准,参考/5.2:
-- 否则,参考应是非易失性常量类型的左值参考(即,cv1 应为常量),或者参考应为右值参考。
临时只能绑定到对 prvalue 的引用。此类引用的类型必须是const
限定的右值引用或右值引用。
MS Visual Studio编译器允许将非const
引用绑定到临时对象,但不受标准批准。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?