6

似乎 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 中,我们有可读的输出(这里的代码):

PKc
PKc

我希望能进入char *微软编译器的第二行,以及 gcc 上的任何东西(但不同于第一行)。我究竟做错了什么?我该如何char const*转向char*

4

2 回答 2

9

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

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*

我们从 get 中删除指针const char*const char然后将 const 删除到 get 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;)

于 2012-11-20T18:15:20.790 回答
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';
}
于 2012-11-20T18:28:53.747 回答