#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
。
答案 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;