【问题标题】:pointer to const object automatic cast to pointer to object指向 const 对象的指针自动转换为指向对象的指针
【发布时间】:2013-07-25 15:38:47
【问题描述】:

为什么 const 指针会自动转换为 non-const 指针?在这个简单的代码中? 不应该在这里警告编译器吗?还是抛出错误?

template<typename T>
const T  makeConst(T a){
    return a;
}    

int * j = new int(9);
int * z = makeConst(j); // cast from int* const  ==>  int*

【问题讨论】:

  • 如果你把const放在它修改的后面,问题应该很明显了。 T const 是什么,如果 Tint*
  • 当然,返回值上的任何顶级constvolatile 都会被忽略,除非返回的类型是类类型。

标签: c++ pointers casting constants


【解决方案1】:

因为int*constconst int* 不同。 int* const 表示不能更改指针指向的内容,但可以更改值。这就是编译器从指针解析&lt;typename T&gt; 的方式。为了解决这个问题,我们通常使用这样的模板:

template<typename T>
const T*  makeConst(T* a){
    return a;
}    

int * j = new int(9);
int * z = makeConst(j); // error C2440 in Visual Studio`

【讨论】:

    【解决方案2】:

    一个 (* const) 指针表示指针的目标地址不能改变,尽管该地址处的对象可能会改变。

    您的函数返回一个 (* const) 指针,但是代码可以编译,因为 (* const) 指针被复制到您的 z 变量中,这不会更改 makeConst 返回的实际指针,然后超出范围并且是销毁。

    如果要防止通过指针修改目标对象,请将 const 放在 * 之前。

    【讨论】:

      猜你喜欢
      • 2015-09-10
      • 1970-01-01
      • 2021-07-22
      • 2017-05-15
      • 2014-01-02
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多