使用修改后的指向const的指针返回指向非const的指针

Cho*_*ett 0 c++ const

const从函数返回指针到非的最佳实践是什么,其中指针是通过修改(非const)指针到const?获得的.像这样:

NODE *top_level(const NODE *input)
{
  while (input->parent != nullptr)
    input = input->parent;  // NODE::parent is (non-const) NODE*

  return input;  // Compile failure: 
                 // Cannot convert from 'const NODE *' to 'NODE *'
}
Run Code Online (Sandbox Code Playgroud)

我可以const_castconst上回走,这似乎很好,但有没有更好的办法?

Fre*_*Foo 6

至少在标准库中,最佳实践是提供const和不const重载.例如std::strchr声明<cstring>

char *strchr(char *s, int c);
char const *strchr(char const *s, int c);
Run Code Online (Sandbox Code Playgroud)

类似地,功能就像std::map<T>::find有重载一样

iterator find(const Key& key);
const_iterator find(const Key& key) const;
Run Code Online (Sandbox Code Playgroud)

需要注意的是,有没有const在第一个版本预选赛,即使find本身没有任何理由修改map.(*)的一点是,你得到的东西find可以通过一种"的传递来修改地图,所以可变性",find不可能const.我认为同样的情况适用于你的问题.

或者,你可以使用a const_cast,但对我来说,这就像是违背承诺.

关于这种情况的有趣之处在于,如果你可以保证你的函数永远不会被调用到树的顶层项目(或输入的任何东西),那么就不需要强制转换或重载:

struct node {
    node *parent;
};

node *top(node const *n)
{
    node *p = n->parent;
    while (p->parent != 0)
        p = p->parent;
    return p;
}
Run Code Online (Sandbox Code Playgroud)

编译时没有任何警告.

(*)如果std::map实现为splay树,find则必须修改它,但我不认为标准允许splay树,因为复杂性保证.