auto关键字和顶级,低级常量

时间:2016-06-28 05:09:16

标签: c++ const auto

在C ++ Primer中,提到 - auto通常会忽略顶级常量。像往常一样,在初始化中,保持低级常量,例如当初始化是指向常量的指针时。

const int ci = i,&cr=ci; 

auto b=ci; //ok:b is an int (top level constants in ci is ignored)

auto d=&i; //d is an int* (& of a int object is int *)

auto e=&ci; // e is a const int *(& of a constant object is a low level constant)

现在,我的问题是:在第二个语句中,const被忽略,b的类型是int。 但是在最后一个语句中,ci的const不会被忽略,类型是const int *,而不是int *。为什么??

4 个答案:

答案 0 :(得分:3)

当您使用auto b=ci;时,您创建了ci的副本。因此C ++没有理由阻止您更改b的值。 但是如果你使用auto e=&ci;,你将创建一个const int变量ci的指针。 e应该是一个常量值的指针,以防止您更改ci的值。

答案 1 :(得分:1)

使用

<?php
$this->registerJs('
    function formatState (fish) {
      if (!fish.id) { return fish.text; }
      var $fish = $(
        "<span><img src=/www/target_fish_pic/"+fish.text+ " class=img-flag style=width:50px />"+  fish.text +"</span>"
      );
      return $fish;
    };

    $("#boatinformation-targetfish_id").select2({
        placeholder: "Select Targeted Fish",
      templateResult: formatState,
      templateSelection: formatState,
    });

$(document).ready(function(){
    $("#boatinformation-in_water_slip").change();
});
$("#boatinformation-in_water_slip").on("change",function(){
    if( $(this).val()==="0"){
        $(".slip_controls").hide()
        $(".guest_controls").show()
    }
    else{
        $(".slip_controls").show()
        $(".guest_controls").hide()
    }
});
');

定义map(Targetfish::find()->all(),'id','image')对象长期以来一直是混乱的根源。它让人们认为;

const int i = ...;

还定义了一个const指针。这将是一个错误的结论。如果稍微移动const int* ptr = ...; ,则不会产生混淆。

const

来到顶级cv资格赛的问题,

const

定义一个类型为int i = ...; // Defines i to be a non-const object int const i = ...; // Defines i to be a const object int* ptr = ...; // Defines ptr to be a non-const pointer to a non-const object int const* ptr = ...; // Defines ptr to be a non-const pointer to a const object int* const ptr = ...; // Defines ptr to be a const pointer to a non-const object int const* const ptr = ...; // Defines ptr to be a const pointer to a const object 并且具有int const i = ...; 限定符的对象。

int

定义一个类型为const并且具有int volatile i = ...; 限定符的对象。

int

定义一个类型为volatile但没有int const* ptr = ...; int const*限定符的对象。第二级类型const具有volatile限定符,但不是顶级类型。

int

定义一个类型为const并且具有int const* const ptr = ...; 限定符的对象。第二级类型int const*也具有const限定符。

int

定义一个类型为const并且具有int * const ptr = ...; 限定符的对象。第二级类型int*没有const限定符。

更多信息:

Where is the definition of `top-level cv-qualifiers` in the C++11 Standard?
What are top-level const qualifiers?

答案 2 :(得分:0)

它是一个低级常量,因为它直接引用它。 auto b = cici的值复制到b,但auto e = &ci必须有一些const - 因为它不会复制ci,而是指向ci存在的位置。在这种情况下,术语低级意味着没有太多的间接性。

答案 3 :(得分:0)

你忘了提及int i=0; 这里i可以在程序的上下文中改变,这使得它不是恒定的。

  

在第二个语句中,const被忽略

因此,没有要忽略的顶级const

C ++ Primer中的实际代码,

int i = 0;//Value of i is 0 but it might change
const int ci = i;//Value of ci will not change once initialized
auto d = &i;//Hence d is an int*(No top-level const)
  

在最后一个语句中,ci的const不被忽略

&安培; const对象的一个​​低级const auto不忽略

auto e = &ci;// e is const int*(low-level const)