返回对内部对象的引用时的常量
Const-ness when returning reference to an internal object
我正在努力理解下面的情况,它的行为与我预期的不同。
给定以下代码示例:
class ConstTestClass
{
std::deque<unsigned long long> deque;
public:
const std::deque<unsigned long long int> &getDeque() const{return deque;}
};
int main()
{
ConstTestClass constTestClass;
auto constDeque = constTestClass.getDeque();
constDeque.emplace_back(1ULL);
}
我希望调用constDeque.emplace_back(1ULL);
失败,因为我希望constDeque
是对const std::deque<>
的引用,但它实际上在GCC 5.4.0上编译时没有任何错误。
如果我将上面的行更改为const auto constDeque = constTestClass.getDeque();
,它将无法按预期编译,因为constDeque
现在是预期的类型。
我试图理解为什么auto
可以从返回类型中删除常量,以及我理解中的错误所在。
编辑:这不是重复回答。我仍在寻找一种方法来确保调用方始终获得指向内部对象的常量引用(或指针),这样调用方将看到itnernal对象的状态更改,而无需修改它
auto
使用与模板参数推导相同的规则。为了进一步澄清,假设您有一个函数(例如foo
):
template<typename T>
void foo(T v) {
v.emplace_back(1ULL);
}
然后你做以下操作:
std::deque<unsigned long long> dq;
const std::deque<unsigned long long> &dqr = dq;
foo(dqr);
此代码还将通过编译器Live Demo。之所以会发生这种情况,是因为根据模板参数推导规则,T
将被推导为std::deque<unsigned long long>
,dqr
将通过副本传递给foo
。
现在假设auto
是一个模板参数(例如.T
):
T constDeque = constTestClass.getDeque();
由于auto
使用了与模板参数推导相同的规则,如foo
中的示例所示,它将在std::deque<unsigned long long>
中推导T
。
因此,您正在创建const
成员std::deque
成员变量的副本。为了得到你预期的行为,你必须对你的auto
推导提供一点帮助,并写下:
auto &constDeque = constTestClass.getDeque();
或者,如果您想进一步向代码的读者澄清所得到的auto
推导是const
限定变量,您可以显式添加const
限定符作为:
auto const &constDeque = constTestClass.getDeque();
- 什么时候在C++中返回常量引用是个好主意
- 通过常量引用传递参数的矩阵模板类
- 在C++中使用非常量引用作为常量
- 具有常量引用参数的函数模板专用化
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 为什么常量方法可以采用非常量引用?
- 为什么当我们有常量引用时创建临时对象?
- 如何返回向量的常量引用?
- C++:常量引用参数
- 不同于按值传递和常量引用传递的程序集
- 为什么const_cast和static_cast常量引用没有效果?
- C++ 获取函数在常量引用中按值返回的结果
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C++中大多数/所有 setter 函数的参数是否应该写为常量引用?
- 通过非常量引用参数修改常量引用参数
- 将常量引用传递给线程
- 为什么C++中没有常量引用,就像常量指针一样?