当一个方法只接受 Foo *const 时,我应该const_cast "this"吗?
Should I const_cast "this" when a method only accepts Foo *const?
我有一个类Foo
,它是在一个自引用的树状结构(最低限度):
class Foo {
public:
// Gets this child's position relative to it's parent.
int getPosition() const {
return parent->indexOf(this);
}
int indexOf(const Foo *const child) const {
return children.indexOf(child); // this line causes an error.
}
private:
Foo *parent;
QList<Foo *> children;
}
行return children.indexOf(child)
期望const T &value
按照QList文档传递,这在我的场景中解析为Foo *const &value
。
为了让我的getPosition()
方法调用我自己的indexOf()
方法,为了从const方法传递this
,需要至少有const Foo *child
的签名。(因为这是const Foo *const
).
我的代码不会编译,但是const Foo *const child
不能为QList::indexOf
转换为Foo *const child
。我的两个方法都没有修改对象状态,所以它们应该是const的(也就是说,我不想取消getPosition
的成本来接收一个非const的this
)。
所以问题是,我如何从this
在const上下文中(const Foo *const
)到QList::indexOf
所需要的。既然我知道我的indexOf
(以及随后的调用)不会改变它,我应该在getPosition
中常量转换this
吗?
还有什么我应该做的吗?也许我的设计有问题。
我认为这是const_cast
的一个完全合理的用例,但是它不是this
,你需要const_cast
,但child
。在这种情况下,QList::indexOf
期望一个指向Foo
(Foo* const
)的常量指针,但child
是一个指向Foo
(const Foo* const
)的常量指针。没有从Foo* const
到const Foo* const
的隐式转换,因为这将从所指向的值中删除const-ness。
那么,为了修复你的代码,我将把这行改为
return children.indexOf(const_cast<Foo*>(child));
你知道QList::indexOf
不会修改任何child
指向的,所以这不会产生未定义的行为。然而,我还是要加一条评论,解释为什么const_cast
是必要的。
- 我应该使用什么来代替void作为变体中的替代类型之一
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 违反const正确性:我应该现实地期待什么问题
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 我应该使用 const shared_ptr<T>&or shared_ptr<T> 作为我的 lambda 函数的参数吗?
- 转发模板参数的const-度,我应该使用转发参考
- 我应该更喜欢在函数中的常数:constexpr const或enum
- 我应该始终使用"T&&"而不是"const T&"或"T&"来绑定到回调函数吗?
- 我应该在简单的访问成员函数中使用 const 返回类型吗?
- 为什么我应该使用 const T& 而不是 const T 或 T&
- 我应该通过const引用传递std::函数吗
- 我应该更喜欢const函数吗
- 为什么我应该在我的捕获块中使用"const"?
- 重新实现std::swap,我应该为tmp变量使用const吗
- 当一个方法只接受 Foo *const 时,我应该const_cast "this"吗?
- 我应该什么时候通过 T const& 返回?
- 我应该使用 const &iterator,还是只使用迭代器?
- 我应该将其声明为类的const int成员变量吗?
- 我应该什么时候传递"T* const&"类型的指针?
- 与const和non-const相同的对象,我应该假设什么行为正确