草庐IT

const_buffers

全部标签

c++ - 为什么不对指针强制执行 constness?

考虑以下代码片段:classA{public:voidnonConstFun(){}};classB{private:Aa_;A*pA_;public:voidfun()const{pA_->nonConstFun();//a_.nonConstFun();//Givesconstrelatederror}};intmain(){Bb;b.fun();}在这里,我希望编译器会因为在B::fun()内调用A::nonConstFun()的常量而失败,而不管类型如何一个对象。但是编译器会提示对象,而不是指针。为什么?我在Windows10上使用VS2017。 最

c++ - const int *p 与 int const *p - 类型后的 const 是否可以接受?

我的同事在他提出的问题(1、2)上是0比2,所以我想我会给他一个追上来的机会。我们最近的分歧是关于在哪里放置“const”声明的样式问题。他认为它应该放在类型前面或指针后面。原因是这是其他人通常会做的事情,而其他样式很容易混淆。因此,指向常量int的指针和指向int的常量指针将分别为:constint*i;int*consti;但是,我还是很困惑。我需要一致且易于理解的规则,而我能够理解“const”的唯一方法是它在它正在修改的东西之后。有一个异常(exception)允许它在最终类型之前,但这是一个异常(exception),所以如果我不使用它对我来说会更容易。因此指向常量int的指

C++ const 关键字 - 随意使用?

在以下C++函数中:voidMyFunction(intage,House&purchased_house){...}voidMyFunction(constintage,House&purchased_house){...}哪个更好?在两者中,“年龄”都是按值传递的。我想知道'const'关键字是否是必要的:这对我来说似乎是多余的,但也很有帮助(作为变量不会改变的额外指示)。有没有人认为以上哪一项(如果有的话)更好? 最佳答案 首先,它只是一个实现细节,if你把const放在那里,不要把它放在声明集(标题)中。只放在实现文件中:/

C++:char** 到 const char** 的转换

这个问题在这里已经有了答案:WhyamIgettinganerrorconvertinga‘float**’to‘constfloat**’?(4个回答)关闭8年前。在C++中,当从转换时,为什么不能将char**作为参数传递给接受constchar**的函数>char*到constchar*是可以的,如下图voidf1(constchar**a){}voidf2(constchar*b){}intmain(intargc,charconst*argv[]){char*c;f1(&c);//doesn'tworkf2(c);//worksreturn0;}编译器输出是test.cpp:

c++ - 关于将 const 引用绑定(bind)到临时对象的子对象

像这样的代码#includestructP2d{doublex,y;P2d(doublex,doubley):x(x),y(y){}~P2d(){printf("Destructorcalled\n");}};P2dcenter(){returnP2d(10,10);}intmain(intargc,constchar*argv[]){constdouble&x=center().x;printf("x=%.18g\n",x);return0;}g++(5.2.0版)会在进入printf中之前销毁P2d临时实例main,但无论如何都会保留该值(即,不是将x绑定(bind)到临时P2d实

c++ - 从 C++ 中的 const 成员函数修改引用成员

我正在研究我的代码的const正确性,只是想知道为什么这段代码可以编译:classX{intx;int&y;public:X(int&_y):y(_y){}voidf(int&newY)const{//x=3;wouldnotwork,that'sfiney=newY;//doescompile.Why?}};intmain(intargc,char**argv){inti1=0,i2=0;XmyX(i1);myX.f(i2);...}据我了解,f()正在更改对象myX,尽管它说是const。当我分配给y时,如何确保我的编译器提示?(VisualC++2008)非常感谢!

c++ - 模板选择 const 引用而不是 const 指针

考虑以下几点:templatevoidFoo(constT*x){std::coutvoidFoo(constT&x){std::cout鉴于上述情况,我希望以下调用指针重载:int*x;Foo(x);但事实并非如此。这对我来说似乎很奇怪,因为constT*可以清楚地绑定(bind)到非constT就像constT&一样,但是指针变体似乎“更合适”。对于我的应用程序,我希望调用指针变体。我可以通过额外的特化来完成这项工作:templatevoidFoo(T*x){constT*const_x=x;Foo(const_x);}但这感觉是错误的和不必要的。有没有更好的办法?我不明白什么(除

c++ - 非常量对象的 const vector

在接口(interface)中定义函数:virtualvoidModifyPreComputedCoeffs(std::vector&model_)=0;我们希望指定vector模型_不应更改,因为不应对vector执行push_back等操作,但模型_中的IndexCoeffPair_t结构对象可以更改。我们应该如何指定?virtualvoidModifyPreComputedCoeffs(conststd::vector&model_)=0;我认为不起作用。 最佳答案 与其将vector传递给函数,不如按照标准库的方式传递一对迭

c++ - 相同的 const 类型限定符

一个类型有两个const会发出警告/错误。但是,如果类型已使用typedef定义,编译器会接受它(VisualStudio2013和在线编译器C++shell)。#includetypedefconstintvalue_type;intmain(){constvalue_typen=0;//okconstconstintn2=0;//errorC4114return0;}有人知道为什么吗?是不是那个是const(constint),和constconstint不一样? 最佳答案 在typedef情况下明确允许,而在声明本身中不允许:

c++ - std::add_const 和类似的用例

中的一些类型转换也可以使用核心语言语法来表达(例如std::add_const::type是/似乎等同于constT)。std::add_lvalue_reference的Dtto,也许还有其他人。这些类型特征有什么用?我完全理解,如果没有它们,标准将提供一个“不完整的工具箱”,我可以想象以元方式使用,如下所示:templateclassModifier>structApply{typedeftypenameModifier::typeOut;};Apply这些特征是否还有其他可以用句法表达的用例,或者它们只是“出于完整性感”而包含在偶尔的元使用中? 最佳答