当与`decltype`一起使用时,为什么std :: remove_const不删除参考对象的'const`-ness?

时间:2019-02-10 03:33:34

标签: c++ c++11 const decltype reference-type

#define T int
int main ()
{
  const T x = 2;
  // (1) -- type of `x` is compared with `T`
  static_assert(std::is_same<std::remove_const<decltype(x)>::type, T>::value, "Not same");
  // (2) -- type of `x` is compared with `const T`
  static_assert(std::is_same<std::remove_const<decltype(x)>::type, const T>::value, "Not same");
}

以上代码按预期工作。 (1)通过而(2)失败。

但是,它发生在相反的方向,即。 (1)失败,(2)通过,如果我进行以下更改:

#define T int& // <--- added reference

为什么会这样?

使用类似decltype的代码,我们可以在代码中添加什么,以便(1)传递引用类型和非引用类型,即int&int
也欢迎使用const_cast的解决方案。


注意:由于我想从对象中宏观移除const;我用过decltype

1 个答案:

答案 0 :(得分:0)

因为使用了文本替换宏而不是typedef,所以您得到了const int& x

const int&不是const类型,因此remove_const不执行任何操作。

因为C ++没有任何引用突变操作,所以无法更改引用的const样式。

如果您要删除最里面的const(将const T放在其中),则可以这样做:

template <typename T>
struct remove_deepest_const_impl { typedef T type; };

template <typename T>
struct remove_deepest_const_impl<const T> { typedef T type; };

template <typename T>
struct remove_deepest_const_impl<T*>
{ typedef typename remove_deepest_const_impl<T>::type* type; };

template <typename T>
struct remove_deepest_const_impl<T* const>
{ typedef typename remove_deepest_const_impl<T>::type* const type; };

template <typename T>
struct remove_deepest_const_impl<T&>
{ typedef typename remove_deepest_const_impl<T>::type& type; };

template <typename T>
struct remove_deepest_const_impl<T&&>
{ typedef typename remove_deepest_const_impl<T>::type&& type; };

template <typename T> using remove_deepest_const
       = typename remove_deepest_const_impl<T>::type;

演示:https://rextester.com/OUTIN28468