在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 *。为什么??
答案 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 = ci
将ci
的值复制到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)