草庐IT

Constants

全部标签

c++ - 顶级 const 不影响函数签名

在C++Primer第五版中,它说:intf(int){/*canwritetoparameter*/}intf(constint){/*cannotwritetoparameter*/}这两个函数无法区分。但是如您所知,这两个函数在更新参数的方式上确实存在差异。谁能给我解释一下?编辑我想我没有很好地解释我的问题。我真正关心的是为什么C++不允许这两个函数同时作为不同的函数,因为它们在“是否可以写入参数”方面确实不同。直觉上应该是!编辑按值传递的本质其实是通过将参数值复制到参数值来传递。即使对于引用和指针,您复制的值是地址。从调用者的角度来看,无论是const还是non-const传递

c++ - C++中const的用法

我是C++的新手。我正在阅读一本C++的书,上面写着constinti[]={1,2,3,4};floatf[i[3]];//Illegal编译时说float变量声明无效,这是为什么呢?假设我们使用inti=3;floatf[i];有效。第一种情况有什么问题?谢谢。 最佳答案 所以第一个是非法的,因为数组必须有一个编译时已知的界限,而i[3],虽然严格来说在编译时已知,但不满足语言设置的标准“编译时已知”。出于同样的原因,第二个也是非法的。然而,这两种情况通常都会被GCC接受,因为它支持C99风格的运行时大小的数组作为C++中的扩展

c++ - constexpr 类的设计 : merging constexpr and non-constexpr versions?

考虑一个在运行时只包装一个值的类:templateclassNonConstValue{public:NonConstValue(constType&val):_value(val){;}Typeget()const{return_value;}voidset(constType&val)const{_value=val;}protected:Type_value;};以及它的constexpr版本:templateclassConstValue{public:constexprConstValue(constType&val):_value(val){;}constexprTypeg

c++ - 常量映射迭代器不会设置为 mymap.begin()

map::iteratorit=mymap.begin();迭代器似乎是常量,但items.begin()不返回常量迭代器。或者,这就是我的想法,因为鼠标悬停错误类似于:"Noconversionfrom'std::Tree_const_iteratortostd::Tree_iteratorexists'".为什么? 最佳答案 将const_iterator用作:map::const_iteratorit=mymap.begin();从错误来看,很明显mymap.begin()返回const_iterator。这是因为mymap在

c++ - 指向常量值的常量数组指针

如果我创建一个常量值的全局数组,例如constintSOME_LIST[SOME_LIST_SIZE]={2,3,5,7,11};是否可以以任何方式修改SOME_LIST?我如何编写这样的SOME_LIST指向一个const内存位置,并且本身是一个const指针(即不能指向其他地方)? 最佳答案 有3个主要的指针示例涉及“const”关键字。(参见此link)首先:声明一个指向常量变量的指针。指针可以移动,可以改变指向的内容,但不能修改变量。constint*p_int;其次:声明一个指向变量的“不可移动”指针。指针是“固定的”,但

c++ - 使变量成为常数的重要性是什么?

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭3年前。Improvethisquestion在什么情况下需要将变量设为常量?如果您希望一个变量始终保持相同的值,难道您不能不更改它吗?

c++ - 常量成员函数

看完this,据我所知,将方法声明为const可以防止它意外修改类的成员变量。const方法是否常用?是否应该将它们用于一切不应修改成员变量的情况? 最佳答案 是的,const应始终在适当的时候使用。它让您的编译器检查您的应用程序逻辑,静态断言const-correctness免费!有些人甚至说const应该是默认值,对于非常量,你应该被迫使用mutable。 关于c++-常量成员函数,我们在StackOverflow上找到一个类似的问题: https://s

c++ - const 是否允许在此处进行(理论上的)优化?

考虑这个片段:voidfoo(constint&);intbar();inttest1(){intx=bar();inty=x;foo(x);returnx-y;}inttest2(){constintx=bar();constinty=x;foo(x);returnx-y;}在我对标准的理解中,x和y都不允许被test2中的foo改变>,而它们可以通过test1中的foo进行更改(例如使用const_cast从constint&因为引用的对象在test1中实际上不是const。现在,neithergccnorclangnorMSVC似乎将test2优化为foo(bar());retu

c++ - 为什么 T const&& 不是转发引用?

在模板上下文中,应用以下“引用折叠”规则:templatevoidfoo(T&&t){//T&&->T&//T&&&->T&//T&&&->T&//T&&&&->T&&}为什么该语言禁止“通用引用”具有const限定符?templatevoidfoo(Tconst&&t)如果类型已解析为引用(4种情况中的3种),这似乎是有意义的。我确信这个想法与该语言的其他一些设计方面不兼容,但我不能完全看到全貌。 最佳答案 最初右值引用提案说如果P就会发生转换。是“右值引用类型”。However,adefectreport后来注意到了Additi

c++ - 使用 extern const 将结构传递给模板。什么是外部?

我在问自己为什么下面的代码有效,以及说明符extern在实例化baz_instance时做了什么:structbaz{intvalue;};externconstbazbaz_instance={3};templateintfoo(){returnb.value;}intmain(){foo();return1;}为什么上面的代码首先编译,如果省略extern说明符,为什么它不再编译?extern说明符在此示例中的作用是什么? 最佳答案 这是从C++03到C++11的标准部分之一。在C++03中,[temp.arg.nontype]