为什么int指针的const向量中的dereferenced元素是可变的?

时间:2017-09-08 07:20:07

标签: c++ pointers vector const operator-precedence

我不确定 start: function() { //-- Add flexslider active class to li of nav control instead of just on the image if ($('.testimonial-section .flexslider ol.flex-control-nav').length > 0) { // initial check and addition $('.testimonial-section .flexslider ol.flex-control-nav li').each(function() { if ($(this).children('img').hasClass('flex-active')) { $(this).children('img').removeClass('flex-active'); $(this).addClass('flex-active'); } else { $(this).removeClass('flex-active'); } }); // bind into flexslider callback and run dynamically $('.testimonial-section .flexslider').bind('start', function(event, slider) { $('.testimonial-section .flexslider ol.flex-control-nav li').each(function() { if ($(this).children('img').hasClass('flex-active')) { $(this).children('img').removeClass('flex-active'); $(this).addClass('flex-active'); } else { $(this).removeClass('flex-active'); } }); }); } }, after: function() { //-- Add flexslider active class to li of nav control instead of just on the image if ($('.testimonial-section .flexslider ol.flex-control-nav').length > 0) { // initial check and addition $('.testimonial-section .flexslider ol.flex-control-nav li').each(function() { if ($(this).children('img').hasClass('flex-active')) { $(this).children('img').removeClass('flex-active'); $(this).addClass('flex-active'); } else { $(this).removeClass('flex-active'); } }); // bind into flexslider callback and run dynamically $('.testimonial-section .flexslider').bind('after', function(event, slider) { $('.testimonial-section .flexslider ol.flex-control-nav li').each(function() { if ($(this).children('img').hasClass('flex-active')) { $(this).children('img').removeClass('flex-active'); $(this).addClass('flex-active'); } else { $(this).removeClass('flex-active'); } }); }); } } 的真正含义所以我编写了下面的代码来获得一个想法但现在更加困惑。

const vector<int *>

如果我在这里停下来,我会认为vector<int *> v; int x = 1, y = 2; v.push_back(&x); v.push_back(&y); const vector<int *> w = v; w[0] = &y; //failed. Element is a constant pointer? *(w[0]) ++; //failed. Element pointer references to constant value? const vector<int *>的向量,但后来我尝试了以下与此假设明显矛盾的内容。

const int * const

现在*(w[0]) += 3; //passed. Value not constant? *(w[0]) = 20; //passed. Why... 由于我不知道的原因,显然会对*(w[0])++进行不同的处理。我确信+=只声明const vector类的常量对象,并且上述结果可能取决于vector类的运算符重载的实际实现。但我无法绕过这个。有人可以帮忙解释一下吗?

如果相关,我在Mac上使用g ++ 4.2。

4 个答案:

答案 0 :(得分:33)

  

为什么int指针的const向量中的dereferenced元素是可变的?

对于const vector<int *>,元素将是const指向非const的指针,即int * const,因此您可以修改指针指向的对象,但不能指针本身。

根据Operator Precedence,后缀增量运算符的优先级高于operator*,因此*(w[0]) ++;等同于

* ((w[0]) ++);

首先执行指针的增量,然后失败。 w[0] = &y;也试图修改指针,因此也失败了。

另一方面,(*w[0]) ++;(即指针对象的增量)没问题。以下语句也很好,因为它们都修改了指针所指向的对象,而不是指针。

*(w[0]) += 3; //passed.
*(w[0]) = 20; //passed.

答案 1 :(得分:9)

这是operator precedence的问题。

执行*(w[0]) ++时,您尝试修改指针

执行*(w[0]) += 3时,修改指针指向的数据。

答案 2 :(得分:6)

wconst vector<int *>const 限定符将应用于向量。因此,相应的const成员函数将用于operator[]

const_reference operator[]( size_type pos ) const;

由于向量为const - 限定且包含int *类型(而非const int *)的元素,因此表达式w[0]的类型为int * const& (而不是const int *&)。也就是说,它是对指向int 的常量指针的引用,而不是对指向常量int 的指针的引用:< em> constness 应用于指针本身,而不是指向的数据。

通过执行*(w[0]) += 3,您不是要修改向量返回的指针的(即const),而是此指针指向的值。由于此指针的类型为int * const(而不是const int *),因此您可以修改它指向的内容,因此它确实有效。但是,执行w[0] = &y正在对常量指针执行赋值,因此它不会编译。

答案 3 :(得分:1)

const vector<T>允许您将其元素作为T const &即。 const T &)进行访问。在这种情况下,Tint *,因此这是int * const &,是指向int的指针的const引用。指针是常量,但int不是。

向量的类型必须是vector<int const *> vector<const int*>),在这种情况下,元素将通过int const * const &访问。

底线,constness是传递模板而不是指针。如果你把指针放在模板中,你会得到一些两种行为。