似乎std :: remove_const无法删除const char*
的常量。请考虑以下代码:
#include <iostream>
#include <type_traits>
#include <typeinfo>
template< typename T >
struct S
{
static void foo( ) {
std::cout << typeid(T).name() << std::endl;
std::cout << typeid( std::remove_const<T>::type ).name() << std::endl;
}
};
int main( )
{
S<char const*>::foo();
}
此程序的输出(在Visual Studio 2010上):
char const *
char const *
在gcc中我们有可读输出(代码here):
PKc
PKc
我希望得到char *
在Microsoft编译器的第二行,以及gcc上的任何内容(但不同于第一行)。我究竟做错了什么?如何将char const*
变为char*
?
答案 0 :(得分:8)
char const*
是指向const char
的指针,但指针本身不是const
。要从指向的类型中删除常量,可以执行以下操作:
std::add_pointer<typename std::remove_const<typename std::remove_pointer<T>::type>::type>::type
或者:
typename std::remove_const<typename std::remove_pointer<T>::type>::type*
我们从const char*
删除指针以获取const char
,然后删除const以获取char
,然后将指针添加回get char*
。不是特别漂亮。测试:
typedef const char * type_before;
std::cout << typeid(type_before).name() << std::endl;
typedef typename std::remove_const<typename std::remove_pointer<type_before>::type>::type* type_after;
std::cout << typeid(type_after).name() << std::endl;
在我的系统上使用g ++,输出:
PKc
Pc
这应该会给你一个关于“PKc”意味着什么的提示。 P代表指针,c代表char
,K代表konst
;)
答案 1 :(得分:8)
如果要删除所有const限定符,则需要一个递归删除所有级别的const的解决方案:
template<typename T> struct remove_all_const : std::remove_const<T> {};
template<typename T> struct remove_all_const<T*> {
typedef typename remove_all_const<T>::type *type;
};
template<typename T> struct remove_all_const<T * const> {
typedef typename remove_all_const<T>::type *type;
};
int main() {
std::cout << typeid(remove_all_const<int const * * const>::type).name() << '\n';
}