作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
看起来 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
我希望在 Microsoft 编译器的第二行获得 char *
,在 gcc 上获得任何(但不同于第一行)。我究竟做错了什么?如何将 char const*
转换为 char*
?
最佳答案
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
,然后把指针加回获取字符*
。不是特别漂亮。测试:
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
;)
关于c++ - 如何从 'char const*' 中删除常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13479433/
我是一名优秀的程序员,十分优秀!