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_cast在const上回走,这似乎很好,但有没有更好的办法?
至少在标准库中,最佳实践是提供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树,因为复杂性保证.