如何防止从非常量访问指针中过滤指针向量的函数?

Posted

技术标签:

【中文标题】如何防止从非常量访问指针中过滤指针向量的函数?【英文标题】:How to prevent a function which filters vector of pointers from non-const-accessing pointees? 【发布时间】:2015-12-19 13:32:18 【问题描述】:

我有一个函数,它过滤指针向量,返回过滤后的版本。根据其参数的性质,类型为const vector<Data*>&,它可以更改指针指向的Data 结构。有什么办法让它无法通过指针更改Data,同时仍然能够返回其参数的过滤版本vector<Data*>

【问题讨论】:

您可以使用一些指针包装器,当取消引用并成为 const 时,它将返回 const& 给指针对象。原始指针和智能指针返回可变引用 你会在你的代码中允许什么来实现这一点?不能直接做。 @black 函数参数可以修改,函数源也可以。即使来电者也可以。它只是需要或多或少地简单(并且可扩展)。 【参考方案1】:

你有一个一元函数:

(const vector<Data*>&)

您不能在向量内强制转换指针的常量,但您可以更改函数的参数类型。我建议这样做:

(const Data* const*, size_t)

然后,这样称呼它:

filter(vec.data(), vec.size());

现在您的函数正在接受指向const Data 的指针,因此无法更改它们。调用者不需要做任何特别的事情。如果你想保持旧的调用风格,你可以做一个包装器:

filter(const vector<Data*>& vec) 
  return filter(vec.data(), vec.size());

至于返回类型,可以用const_cast

vector<Data*> filter(const Data* const* data, size_t size) 
  vector<Data*> results;
  for (size_t ii = 0; ii < size; ++ii) 
    results.push_back(const_cast<Data*>(data[ii]));
  
  return results;

这些都不能提供“完美”的安全性,但是,const 永远不会!

【讨论】:

vec.data() 将是Data**,不是吗? (或 Data * const *,用于 const 限定的 vec)。 @T.C.:谢谢,我解决了这个问题。我现在实际上已经在我的答案中编译了代码。 :)

以上是关于如何防止从非常量访问指针中过滤指针向量的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确声明从非常量迭代器到指针的 const 指针

通过指针在函数之间传递向量

从指针向量调用函数

如何在类向量中存储/使用外部函数指针

如何访问包含指向字符串的指针的向量的元素?

从 2D 向量创建 1D 向量的函数(错误:表达式必须具有指向对象的指针类型)