考虑一下
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*.
让
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
一个类包含一个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) 在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)