这是const_cast的有效用法吗?

xiv*_*r77 0 c++ const const-cast

在示例代码中,调用message()永远不会影响类的内容,所以我希望方法是const.但是我也不希望返回值const,所以const_cast下面使用它是否安全?还是有更好的解决方案?

编辑:抱歉..这n_是一个指针!

编辑2:我终于设法正确地重新产生了问题.如果n_是一个数组int n[100]怎么办?然后我看到没有问题const_cast.

class A
{
private:
    int n_[10];

public:
    /* ... */

    int* n() const
    {
        return const_cast<int*>(n_);
    }
};
Run Code Online (Sandbox Code Playgroud)

Mar*_*som 7

返回类型(不是引用)将复制您要返回的对象.因此无需投射,可以在不影响原件的情况下更改副本.如果删除,代码将干净地编译const_cast.

编辑:基于对问题的最新编辑,我会说这是滥用const_cast.C++遵循的原则是const成员函数不仅不应对对象本身进行任何更改,而且不应返回可用于在函数外部进行更改的任何内容.通过将非const指针返回到成员变量,您违反了此原则.


Ben*_*ley 5

不,这不是一个有效的用途const_cast.

您的函数不是修改数组,而是授予将数组修改为调用者的权限.因此,它应该拥有这些权利.您无法让某人访问您自己无法访问的内容.因此该方法不应该是const,因此不需要const cast.

您可能还需要函数的const版本,它返回一个const int*.这与例如原理相同std::vector::operator[].即使操作符不修改向量,它也会授予访问权限以修改向量,因此它不是const函数.(但是还有一个const重载版本,它返回一个const引用,因此不授予修改向量的权限)