C++ const std::共享\u ptr和const正确性

C++ const std::共享\u ptr和const正确性,c++,C++,假设我有一节课 class K { public: int k = 0; void Change() { k++; } void None() const { std::cout << "None \n"; } }; 为什么像这样在常量引用上使用非常量方法是完全正确的 void FN(const std::shared_ptr<K>& k) { k->

假设我有一节课

class K
{
public:

    int k = 0;

    void Change()
    {
        k++;
    }

    void None() const
    {
        std::cout << "None \n";
    }


};
为什么像这样在常量引用上使用非常量方法是完全正确的

void FN(const std::shared_ptr<K>& k)
{
    k->Change();
}

指针是常量,而不是对象。您不能更改指针指向的对象,但可以更改该对象

如果需要一个常量对象,则需要:

void FN(const std::shared_ptr<const K>& k)
{
    k->Change();
}

另请参见:了解您可能根本不想使用常量共享参数的原因。

指针是常量,而不是对象。您不能更改指针指向的对象,但可以更改该对象

如果需要一个常量对象,则需要:

void FN(const std::shared_ptr<const K>& k)
{
    k->Change();
}

另请参见:了解您可能根本不想使用const shared_ptr参数的原因。

因为此处的const是共享指针,而不是它指向的对象

如果您希望该值为常量,则需要:

void FN(const std::shared_ptr<const K>& k)
//                            ^^^^^

顺便说一句,我知道这只是一个示例代码,但您确实应该将您的成员变量k设置为私有而不是公共。如果没有它,您的类的用户甚至不需要Change函数,他们可以随心所欲地更改它:-

,因为这里的常量是共享指针,而不是它指向的对象

如果您希望该值为常量,则需要:

void FN(const std::shared_ptr<const K>& k)
//                            ^^^^^

顺便说一句,我知道这只是一个示例代码,但您确实应该将您的成员变量k设置为私有而不是公共。否则,类的用户甚至不需要更改函数,他们可以随意更改:-

除非您将所有权传递给FN,否则参数应为void FNK const&k…除非您将所有权传递给FN,否则参数应为void FNK const&k。。。