c++ - 返回 shared_ptr<> 的成员函数的 const 正确性

标签 c++ oop c++11 constants

如果我有课

class foo {
   private:
      std::shared_ptr<char> m_data;
   public:
      std::shared_ptr<const char> GetData()
      { return m_data;}
} 

我相信 std::shared_ptr< T >应该转换为 std::shared_ptr< const T >并共享同一个对象,但函数的 const 正确性是什么?

IE这是有效的吗?

std::shared_ptr<const char> GetData() const;

最佳答案

  • 函数会修改对象的内部状态吗?没有。*

  • 函数是否允许其调用者(或其他外部环境)修改访问对象的内部状态?没有。

这意味着将其标记为 const 是安全的。

* 注意:@Yakk 在注释中正确指出,对于“内部状态”的某些定义,该函数确实修改了它,因为它增加了 char 上的引用计数器由共享指针 m_data 拥有。您必须自己决定这是否构成非常量操作;严格按照语言规则,它不会(因为它修改了 shared_ptr 指向的东西,而不是 shared_ptr 本身)。但由于您首先存储了 shared_ptr,我认为您可以共享所有权,因此不应将其视为修改。

关于c++ - 返回 shared_ptr<> 的成员函数的 const 正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22476296/

相关文章:

c++ - 为什么编译器找不到这个 operator<< 重载?

c++ - 执行策略与何时使用它们之间的区别

multithreading - std::mutex锁定功能和std::lock_guard <std::mutex>之间的区别?

c++ - 为什么在C++中使用静态方法时对nullptr的取消引用不是未定义的行为?

c++ - 修改后的 std::invoke/std::apply,将可调用对象作为 void* - 可能吗?

c++ - 使用自动引用类在 C++ 中创建堆栈时出现问题

java - 如何计算对象中的某些属性

javascript - 为什么在 OOP javascript 中使用 object.prototype.constructor ?

C++ 覆盖嵌套类只能部分说服编译器

c++ - 我应该总是在构造函数中使用 std::move 吗?