如何从'char const *'中删除const

时间:2012-11-20 18:10:14

标签: c++ c++11

似乎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*

2 个答案:

答案 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';
}