【问题标题】:In C++, for some type T, how can I obtain a "const T**" from a "T**"?在 C++ 中,对于某些类型 T,如何从“T**”获取“const T**”?
【发布时间】:2011-12-02 12:21:06
【问题描述】:

我有以下 C++ 代码 sn-p:

class T { };

void f(const T**) { }

int main() {
    T *x = new T[5];
    f(&x);
}

当我尝试编译时,g++ 报告invalid conversion from 'T**' to 'const T**'。我已经完成some research 并且我理解这个错误。典型的解决方法是将f(const T**) 的定义更改为f(const T* const*),这会立即解决问题。

不幸的是,就我而言,f 是另一个库中的函数,我无法更改 f 的定义。如何将x的地址传递给f

【问题讨论】:

    标签: c++ pointers types constants type-conversion


    【解决方案1】:

    相反,您可以传递存储与x 相同值的指针的地址。

    int main() {
        T *x = new T[5];
        T const *y = x;
        f(&y);
    }
    

    f 返回时,您可以将值复制回x

    您也可以投射地址。通过T const * 写入T * 类型的对象不是别名冲突。

    int main() {
        T *x = new T[5];
        f(const_cast<T const**>(&x));
    }
    

    在我看来,这是有效的事实并不像简单地传递一个副本然后分配回x那么明显。

    【讨论】:

    • 感谢您的及时回复!我很高兴有一个不涉及 const-cast 的类型安全解决方案。
    【解决方案2】:
    class T { };
    
    void f(const T**) { }
    
    int main() {
      T *x = new T[5];
      const T* y = x; // <====
      f(&y); // use y
    }
    

    http://ideone.com/oWZQR

    【讨论】:

      【解决方案3】:
      T const* x = new T[5];
      f(&x);
      

      T *x = new T[5];
      f(&const_cast< T const*& >( x ) );
      

      【讨论】:

      • +1 用于令人敬畏的 const-cast 单行。然而,为了可读性,我想我会避免这种情况。 =P
      • 我不知道您可以使用const_cast 以这种方式引用。不错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2012-05-06
      相关资源
      最近更新 更多