草庐IT

Constants

全部标签

c++ - const void * 相对于 void * 提供什么值(value)?

在C++中,使用constvoid*作为函数的参数类型是否比void*更有值(value)?由于void*是不透明的,是否存在任何修改风险,除非用户执行reinterpret_cast,在这种情况下他们同样可以执行const_cast在constvoid*上,因此真的可以买任何东西吗?我问是因为我正在为共享指针使用实用程序模板类,它提供了void的专门化以避免void&问题,但没有为constvoid因此我想知道这是否只是一个疏忽,还是永远不需要它? 最佳答案 它提供了与const在其他指针类型上提供的相同的好处:除非您明确放弃co

c++ - 模板忽略了常量(为什么?)

有人知道,为什么要编译?templateclassFrontBackBuffer{public:FrontBackBuffer(constTBufferTypeFrontfront,constTBufferTypeBackback):////constreferenceassignedtoreference???m_Front(front),m_Back(back){};~FrontBackBuffer(){};TBufferTypeFrontm_Front;///buffer(a,b);//buffer.m_Back=33;buffer.m_Front=55;}我用GCC4.4编译。

c++ - 将 C++ 变量声明为 const 是有助于还是损害性能?

我了解const限定数据类型的行为。不过,我很好奇,如果过度或不够热心地将限定变量作为const,是否会带来任何性能增益或损失。我特别考虑在隔离代码块中声明和使用的变量。例如,像这样的东西:constqrealpadding=CalculatePadding();constQSizeFpage_size=CalculatePagePreviewSize(padding);constQRectFcontent_rect=CalculatePagePreviewContentRect(page_size);constQListpages=renderer.BuildPrintPages(p

c++ - 在函数内声明 const 而不是变量有什么好处吗?

如果我有一个只存在很短时间的函数,将颜色列表设为常数会有什么不同吗?stringgetrandcolor(){conststringcolors[5]={"red","blue","green","yellow","purple"};returncolors[rand()%5];}注意:实际的颜色列表包含数百种颜色,而不仅仅是我展示的小样本,不确定这是否会有所不同。 最佳答案 它可以防止您不小心覆盖您不想更改的变量。“糟糕!”-保护可能是const最重要的功能。假设一个编译器可以通过知道一个变量不应该改变来预测某种优化,但我的测试从

c++ - 用于创建 integral_constants 的任意元组的通用实用程序

利用ScottSchurr'sstr_const我有一个constexpr字符串。classStrConst{public:templateconstexprStrConst(constchar(&str)[N]):str_(str),len_(N-1){static_assert(N>1,"notastring");}constexproperatorconstchar*()const{returnstr_;}constexprsize_tsize()const{returnlen_;}constexprcharoperator[](size_ti)const{returni我有另一

c++ - 非整数常量如何在 C++ 中工作?

所以我知道在C++中,常量在默认情况下获得与变量不同的链接。这就是为什么我不能放intfoo;在某些header中——链接器会正确地提示multipledefinitions.OTOH,我会写constintbar=42;在header中,编译器确保只有一个bar定义。有了整数常量,很容易看出编译器是如何处理这个问题的——至少只要没有人获取bar的地址或做一些其他需要它为其分配存储空间的有趣事情).但是,如果有人这样做怎么办?如果它不是一个整体而是需要在运行时执行代码的东西怎么办?假设我把它放到标题中:conststd::stringbaz="h2g2";假设没有小字符串优化,这需要在

c++ - 我什么时候应该使用 const 呢?

我找到了一些这样的代码:classfoo{inta;public:foo(intv):a{v}{}booloperator==(constfoo&rhs)const&{return(rhs.a==a);}};它编译并运行。我想知道在运算符==中引用(&)有什么好处(或缺点)。 最佳答案 作为T.C.已经在评论中指出,这个原因不是“只接受左值”。const引用可以很好地绑定(bind)到右值。原因是只有当所有重载都指定一个值类别时,函数才能在隐式对象参数的值类别上重载。也就是说,当您添加仅匹配右值的&&重载时,除非您将&添加到现有重载

c# - C#'s readonly vs C++' s const - 等价物

这主要是一个理解检查,因为我找不到关于这个主题的完整引用。在C#中,当我编写readonlyFoomyFoo时,我实际上是在说myFoo是指向Foo的指针,并且指针不能被重新分配。保证底层Foo无法重新分配,我需要一个完整的其他类或接口(interface)ImmutableFoo.现在考虑构造List.它基本上是指向指向Foo的指针列表的指针。,即类似于vector*在C++中。您可以在三个地方放置const在C++中。constvector*constconst#1:您不能修改vector(通过调整大小、重新分配元素等)const#2:你不能修改指向vector内部的Foo-sco

c++ - 带有 const 模板参数的模板模板类

我不明白为什么这不能编译:structA{};templatestructB{};templateclassT1,classT2>structC{};intmain(intac,char**av){typedefBb;//compilestypedefBb_const;//compilestypedefBba;//compilestypedefBba_const;//compilestypedefCc1;//compilestypedefCc2;//compilestypedefCc3;//ISOC++forbidsdeclarationof‘typename’withnotype}(

带有 'const' 的 C++ 模板

考虑以下模板类:templateclassFunction{public:virtualfloateval(constT&x,constT&y)=0;};由于“eval”函数不应修改两个输入“x”和“y”的值,因此我将它们作为“const”。然后我创建以下派生自Function的类classFoo1:publicFunction{public:Foo1():Function(){}virtualfloateval(constfloat*&x,constfloat*&y){...}};当我用g++编译时,我收到以下警告:hiddenoverloadedvirtualfunction'Fu