相关疑难解决方法(0)

矢量和const

考虑一下

 void f(vector<const T*>& p)
 {
 }
 int main()
 { 
  vector<T*> nonConstVec;
  f(nonConstVec);
 }
Run Code Online (Sandbox Code Playgroud)

下列情况不compile.The事情是vector<T*>不能转换到vector <const T*>,这不合逻辑对我来说,因为存在从隐式转换T*const T*.为什么是这样 ?

vector<const T*>也不能转换为vector <T*>,但这是预期的,因为const T*无法隐式转换为T*.

c++ stl const vector

23
推荐指数
4
解决办法
3万
查看次数

将shared_ptr的向量转换为shared_ptr的向量为const

class A
{
    std::vector<std::shared_ptr<int>> v_;
};
Run Code Online (Sandbox Code Playgroud)

现在我想添加v_使用两个公共成员函数的访问权限

std::vector<std::shared_ptr<int>> const & v() { return v_; }
Run Code Online (Sandbox Code Playgroud)

std::vector<std::shared_ptr<int const> const & v() const { TODO }
Run Code Online (Sandbox Code Playgroud)

我不能代替TODO使用return v_;,虽然.

一种选择是不返回引用而是复制.除了明显的性能损失之外,这也会使界面不那么令人满意.

另一种选择是TODO等于return reinterpret_cast<std::vector<std::shared_ptr<int const>> const &>(v_);

我的问题是,这是不确定的行为吗?或者,或者,是否有更好的选择,最好不使用reinterpret_cast

c++ vector const-correctness undefined-behavior reinterpret-cast

7
推荐指数
1
解决办法
447
查看次数

将vector <int*>视为vector <const int*>而不复制(C++ 0x)

一个类包含一个std::vector<int*>.外部代码需要只读访问此向量,不应该能够修改内容(既不是指针也不是内容).在类中,值可能会改变(例如double_values(),因此将它们存储为a std::vector<const int*>是不可能的.

有没有办法在没有复制std::vector<int*>std::vector<const int*>情况下将其作为一个返回?感觉应该是这样,因为const只是在编译时运行来说明什么可以修改和不可修改.

代码:(编译g++ -std=c++0x)

class ReadOnlyAccess
{
public:
  ReadOnlyAccess(const std::vector<int*> & int_ptrs_param):
    int_ptrs(int_ptrs_param)
  {
  }
  const std::vector<int*> & get_int_ptrs() const
  {
    return int_ptrs;
  }
  std::vector<const int*> safely_get_int_ptrs() const
  {
    // will not compile (too bad):
    //    return int_ptrs;

    // need to copy entire vector
    std::vector<const int*> result(int_ptrs.size());
    for (int k=0; k<int_ptrs.size(); k++)
      result[k] = int_ptrs[k];
    return result;
  }
  void double_values()
  {
    for (int*p : …
Run Code Online (Sandbox Code Playgroud)

c++ const accessor

6
推荐指数
1
解决办法
767
查看次数

boost :: scoped_ptr是否违反了逻辑constness的准则

在boost :: scoped_ptr中operator*,operator->它们是声明的const函数,尽管它们返回T&并且T*可能允许客户端更改底层数据.这违反了逻辑常量的概念(Myers,Effective C++)

const函数不应该有签名吗?

const T& operator*() const;
const T* operator->() const;
Run Code Online (Sandbox Code Playgroud)

c++ const smart-pointers boost-smart-ptr

3
推荐指数
1
解决办法
510
查看次数