【问题标题】:const_cast std::vectorconst_cast std::vector
【发布时间】:2012-08-22 16:12:22
【问题描述】:

我有一个类型为const std::vector<const Array*> &objects 的向量,它作为参数传递给该方法。

我想 const_cast 但由于某种原因我不能这样做。我试过了:

vector<const Array*> obj = const_cast<const std::vector<const Array*> >(objects);

还有其他一些方法,但它一直在抱怨。

有什么想法吗?

【问题讨论】:

    标签: c++ const-cast


    【解决方案1】:

    首先,不要。更改函数的签名以获取非常量引用,这样做会冒 UB 风险:

    const std::vector<const Array*> myData = /* fill */;
    yourFunction(myData); // try to modify my stuff and you get UB!
    

    现在,如果您仍然认为必须这样做,无论出于何种原因(例如旧版 API),都可以这样做:

    vector<const Array*>& obj = const_cast<std::vector<const Array*>&>(objects);
    

    现在 objobjects 引用同一个对象,但 obj 不是 const 限定的。至此,一切都已明确;它只是修改了一个 const object 即 UB,所以要小心。

    【讨论】:

      【解决方案2】:

      我需要将它传递给需要对其进行迭代的函数(它不会进行任何修改)

      使用const_iterator

      您想将const std::vector&lt;const Array*&gt; 转换为const std::vector&lt;const Array*&gt;?他们不是一模一样吗。如果要删除 const:

      std::vector<const Array*> obj = const_cast<std::vector<const Array*> >(objects);
      //                                         |
      //                                      no const
      

      但更重要的问题是:为什么?如果objectsconst,则不应修改它。

      【讨论】:

      • 我需要将它传递给需要对其进行迭代的函数(它不会进行任何修改)但我无法更改 api,例如将函数标记为 const
      • @Cemre 然后使用const_iterator
      • 为了能够使用 const_iterator,我需要修改 API 或函数定义,对吧?
      • @Cemre:如果您编辑了您的问题以提供动力,人们将能够为您提供更好的答案。描述您正在使用的 API、您要调用的函数以及手头的总体问题(为什么要调用它)。
      • @Cemre 没有。您可以使用 const 迭代器迭代 const 向量。
      【解决方案3】:

      您不必在此处强制转换,因为无论如何您都在复制构造内容,并且复制构造函数接受 const 引用。

      只要说:

      std::vector<const Array*> obj = objects;
      

      【讨论】:

        【解决方案4】:

        如果您确定要做什么,这里是如何获取对向量的非常量引用。

        const std::vector<const Array*> &objects;
        
        vector<const Array*>& obj = const_cast<std::vector<const Array*>& >(objects);
        

        【讨论】:

          猜你喜欢
          • 2019-09-22
          • 1970-01-01
          • 1970-01-01
          • 2012-03-07
          • 2020-01-26
          • 2020-09-22
          • 2013-09-23
          相关资源
          最近更新 更多