在非const成员函数中,为什么指向此非const,而decltype指针则为const?

时间:2019-05-31 20:09:03

标签: c++ c++11

我有一个大量的模板化类,我想从中使用吸气剂。遵循通用约定,我避免了像这样的代码重复:

template< typename Foo, typename... Bars >
class Templated
{
...

  constexpr const Foo& get() const 
  { 
    return mFoo;
  }

  constexpr Foo& get() 
  { 
    return const_cast<Foo&>(const_cast<const Templated<Foo, Bars...> *>(this)->get());
  }

但是我想到第二个定义有点笨拙,尤其是对于具有许多模板参数的类。幸运的是,经过一番混乱之后,我发现可以将任何通用类模板简化为:

constexpr Foo& get()
{
  return const_cast<Foo&>(const_cast<decltype(this)>(this)->get());

之所以起作用,是因为出于某种原因,decltype(this)解析为指向类对象类型的const指针,而just(this)解析为指向类对象类型的非const指针。为什么这是事实呢?

1 个答案:

答案 0 :(得分:1)

“不需要指向类对象类型的const指针”。

this是不可变的(this = nullptr;是非法的)。不是*this

只需使add_constremove_const模板函数(或者如果您的C ++版本足够新,则使用std::as_const)就可以使您的生活更加轻松:

template<typename T>
const T* add_const(T* ptr) { return ptr; } // no cast at all!

template<typename T>
T* remove_const(const T* ptr) { return const_cast<T*>(ptr); }
template<typename T>
T& remove_const(const T& ref) { return const_cast<T&>(ref); }

这里add_const(this)正确地导致“指向const对象类型的非const指针”。


为此,您可以在类内部添加

auto cthis() const { return this; }
相关问题