当前位置: 首页 > 知识库问答 >
问题:

编译器忽略函数参数上的“const”

林星华
2023-03-14

我有一个编译器错误问题,请查看以下代码:

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;
}

问题在于编译器忽略了 foo 函数上的“const”,使得对 foo 的调用非法(const int* to int*)。

严重程度代码描述项目文件行抑制状态错误C2664'ululfoo(const::类型)':无法将参数1从'const int*'转换为'const Mystrt::类型'

我在Visual Studio和gcc的5.3编译器中测试了以下代码,它们都删除了相同的错误。

编译器是故意这样做的吗?为什么会发生这种情况?

共有1个答案

扈沛
2023-03-14

const int*int*const,之间有一个重要的区别。有关差异的解释,请参见此答案。

考虑什么< code>const typename MyStruct

若要实现所需的内容,const 必须是该类型的一部分,然后才能使其成为指针。它不能在事后添加,否则它将始终被解释为T * const。可以使用类型特征删除类型的指针部分,添加 const,然后将其设置为指针。

#include <type_traits>

template<class T>
struct MyStruct { };

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

template<class T>
void foo( std::add_const_t<std::remove_pointer_t<typename MyStruct<T>::type>> * myType) {}

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

    return 0;
}
 类似资料:
  • 忽略编译器警告 格式 #pragma clang push #pragma clang diagnostic ignored "错误类型" // 存在警告的代码 #pragma clang pop > 1.在需要忽略的警告处右键 -- Reveal in Log 2.会给出警告的详细信息,其中包括警告的类型 3.高亮选中的便是这个警告的类型 4.在警告代码处增加如下代码 Command

  • 本章将介绍Rust编译器的参数。 Rust编译器程序的名字是rustc,使用它的方法很简单: $ rustc [OPTIONS] INPUT 其中,[OPTIONS]表示编译参数,而INPUT则表示输入文件。而编译参数有以下可选: -h, --help - 输出帮助信息到标准输出; --cfg SPEC - 传入自定义的条件编译参数,使用方法如 fn main() { if cfg!(he

  • 我在服务中使用MongoRepository。在我的例子中,我有三个字段,它们的名字是“姓名”、“年龄”和“性别”。我可以在我的界面中使用以下方法来查询数据: 现在我想用这3个字段的每一个组合来查询数据,所以我需要在这里写7 (3 3 1)方法,它真的很难看。 我试着写些 如果输入只有两个字段:name=Chris,age=18,那么我可以调用 来获取Chris和18岁的人的名单。我怎样才能实现这

  • 问题内容: 如何使装饰器忽略有关缓存键的某些函数参数? 例如,我有一个看起来像这样的函数: 如果我像这样应用装饰器,它将包含在缓存键中。结果,如果我尝试使用相同但不同的函数调用该函数,它将再次执行,这是我想避免的。我只想考虑论点。 问题答案: 使用cachetools可以编写:

  • 问题内容: 我正在使用Guice(v 3.0),并且具有一个将被注入到构造函数中的值。该值可以为null,因此我已在构造函数中使用@Nullable注释了该参数(来自javax.annotations)。 但是,Guice在初始化类时抱怨配置错误: 我不明白为什么这行不通,还有什么需要做的吗? 问题答案: 原来是个日食问题-没有正确刷新我的工作区。

  • 问题内容: 我编译的Go代码并未在Linux上以扩展名结尾。 有关在.gitignore文件中忽略这些提示的任何提示? 问题答案: 将您的构建产品与源代码分开。这有几个优点: 您可以同时启动同一代码的许多不同版本,而无需创建多个克隆 可以很容易确定自己确实做了一次清洁工作;将删除越野车将丢失的文件 您可以从源代码树的只读副本(例如CD-ROM)开始构建 您不太可能意外提交生成的文件 将清除您的源代