1. const std::shared_ptr<T>
是底层const,指针ptr
的指向不能被改变,但是ptr
指向的对象可以改变
对应
T* const ptr
2. std::shared_ptr<const T>
是顶层const,指针ptr
的指向可以被改变,但ptr
指向的对象不能改变,只能调用不改变成员变量的const函数。
对应
const T* ptr
3. 例子
#include <iostream>
#include <memory>
class TypeA {
public:
TypeA(float score) {
score_ = score;
};
~TypeA(){};
void set_score(float score) {
score_ = score;
}
void print_score() const { // 需要定义为const成员函数, 否则std::shared_ptr<const T>无法调用
std::cout << "score:" << score_ << std::endl;
}
private:
float score_ = 0.f;
};
void FuncA(const std::shared_ptr<TypeA>& src, float score) {
src->set_score(score); // 正确,const std::shared_ptr指向对象可以被正常修改
}
void FuncB(std::shared_ptr<const TypeA>& src, float score) {
src->set_score(score); // 错误,std::shared_ptr<const T>指向对象不能被修改
}
int main()
{
auto foo_a = std::make_shared<TypeA>(80.5);
foo_a->print_score();
FuncA(foo_a, 90.5);
std::shared_ptr<const TypeA> foo_b = std::make_shared<TypeA>(82.5);
foo_b->print_score(); // 正常,只调用不改变成员变量的const函数
FuncB(foo_b, 91.5); // 报错,调用了改变成员变量的非const函数
foo_b->print_score();
return 0;
}
4. 总结
shared_ptr<T> p; ---> T * p; : nothing is const
const shared_ptr<T> p; ---> T * const p; : p is const
shared_ptr<const T> p; ---> const T * p; <=> T const * p; : *p is const
const shared_ptr<const T> p; ---> const T * const p; <=> T const * const p; : p and *p are const.
【引用】
- https://cloud.tencent.com/developer/ask/sof/119171