const vector<A>
表示向量vector
里的元素也是const
吗?
在下面的代码中,
v[0].set(1234);
在函数void g(const vector<A>& v)
中会导致编译器错误:
const.cpp:28:3: error: member function 'set' not viable: 'this' argument has type 'const value_type' (aka 'const A'), but function is not marked const
为什么会出现这种情况?
但是,在函数void h(const vector<A *>& v)
中,(*v[0]).set(1234);
对于编译器来说是OK的。
这两个版本间有什么区别?
// ...........................................................
class A {
private:
int a;
public:
A (int a_) : a (a_) { }
int get () const { return a; }
void set (int a_) { a = a_; }
};
// ...........................................................
void g ( const vector<A> & v ) {
cout << v[0].get();
v[0].set (1234);
} // ()
// ...........................................................
void h ( const vector<A *> & v ) {
cout << (*v[0]).get();
(*v[0]).set(1234);
} // ()
h
中,您没有改变指针,而是改变了指针所指向的A
。而指针指向的是一个非const的A
,所以这不是一个问题。容器只给您提供了对保存在其中的指针的 const 访问权限,因此您不能更改它指向的内容。 - Oguk[]运算符
返回其元素的const引用。在第一种情况下,您无法更改_const int&_的值。在第二种情况下,您无法更改对常量指针的引用的值,但可以更改指针所指向的值。 - Julianvector<const T>
是不可能的。T
不允许是const
或volatile
的。在这里也可以参考这个答案:https://dev59.com/-Ww05IYBdhLWcg3w6F4w#6955332 - Zacryon