编译器忽略' const'关于函数参数

时间:2017-02-15 20:04:36

标签: c++ visual-studio templates gcc

我遇到编译错误的问题,请看一下这段代码:

template<class T>
struct MyStruct
{
};

template<>
struct MyStruct<int>
{
    typedef int* type;
};

template<class T>
void foo(const typename MyStruct<T>::type myType)
{
}

int main()
{
    const int* ptr = NULL;
    foo<int>(ptr);

    return 0;
}

问题是编译器忽略了&#39; const&#39;在foo函数上,调用foo非法(const int * to int *)。

  

严重级代码描述项目文件行抑制状态   错误C2664&#39; void foo(const MyStruct :: type)&#39;:无法转换参数1来自&#39; const int *&#39; to&#39; const MyStruct :: type&#39;

我已经在Visual Studio&gt;和gcc的5.3编译器中测试了以下代码,两者都丢失了相同的错误。

编译人员是故意这样做的吗?为什么会这样?

1 个答案:

答案 0 :(得分:7)

[error] Element message I put in target not foundconst int *之间存在重要区别。有关差异的解释,请参阅this answer

考虑int * const的含义。它是const typename MyStruct<T>::type MyStruct<T>::type。在这种情况下,它是const int*。这是一个const,一个无法重新分配新地址的指针,但仍可用于修改指向的int* const。但是,您在int中传递的指针是foo<int>(ptr),无法转换为const int *,因为它会丢弃int * const限定符。

要实现您的目标,const必须是该类型的一部分才能成为指针。它不能在事后添加,也不会被解释为const。您可以使用类型特征来删除类型的指针部分,添加const然后使其成为指针。

T * const