gpt4 book ai didi

c++ - 如何从 'char const*' 中删除常量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:25 27 4
gpt4 key购买 nike

看起来 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com