【发布时间】:2012-11-20 18:10:13
【问题描述】:
看来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 的指针,它本身不是 const。 -
如果没有
typename std::remove_const ...,您发布的代码甚至无法在 gcc 上编译 -
是的,我必须为 gcc 编译器添加 typename。 gcc 的代码在这里:ideone.com/Vd25T8
-
@Uri 您应该始终拥有
typename,而不仅仅是为 gcc 添加它。std::remove_const<T>::type是一个依赖类型(因为它依赖于T),标准要求它前面有typename关键字来表明这一点。 MSVC 将在有和没有typename的情况下编译代码,但如果你省略它,它真的不应该接受代码。 Here's 解释为什么这在 MSVC 中被破坏。