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

Uri*_*Uri 6 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();
}
Run Code Online (Sandbox Code Playgroud)

此程序的输出(在Visual Studio 2010上):

char const *
char const *
Run Code Online (Sandbox Code Playgroud)

在gcc中我们有可读的输出(代码在这里):

PKc
PKc
Run Code Online (Sandbox Code Playgroud)

我希望得到char *第二行的Microsoft编译器,以及gcc上的任何(但不同于第一行).我究竟做错了什么?如何打开char const*char*

Jos*_*eld 9

char const*是指向a的指针const char,但指针本身不是const.要从指向的类型中删除constness,您可以这样做:

std::add_pointer<typename std::remove_const<typename std::remove_pointer<T>::type>::type>::type
Run Code Online (Sandbox Code Playgroud)

或者:

typename std::remove_const<typename std::remove_pointer<T>::type>::type*
Run Code Online (Sandbox Code Playgroud)

我们将指针从const char*get中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;
Run Code Online (Sandbox Code Playgroud)

在我的系统上使用g ++,输出:

PKc
Pc
Run Code Online (Sandbox Code Playgroud)

这应该会给你一个关于"PKc"含义的暗示.P代表指针,c代表char,K代表konst;)


bam*_*s53 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';
}
Run Code Online (Sandbox Code Playgroud)