草庐IT

const-expr

全部标签

c++ - 是否可以在 "const"函数中更改成员变量的值?

常量变量的值可以通过指针技巧改变,但是否可以这样做:classA(){intx;public:voidfunc()const{//changevalueofxhere}} 最佳答案 声明x可变classA(){mutableintx;public:voidfunc()const{//changevalueofxhere}}; 关于c++-是否可以在"const"函数中更改成员变量的值?,我们在StackOverflow上找到一个类似的问题: https://s

c++ - 返回 const 引用是否更有效

例如其中最好的是:std::stringf(){}或conststd::string&f(){} 最佳答案 函数不应返回对局部对象/变量的引用,因为此类对象超出范围并在函数返回时被销毁。不同的是,函数可以返回一个对象的常量或非常量引用,其范围不受函数上下文的限制。典型的例子是自定义operator:std::ostream&operator不幸的是,按值返回有其性能缺陷。正如Chris提到的,按值返回对象涉及临时对象的拷贝及其后续销毁。复制通过复制构造函数或operator=进行。.为了避免这些低效率,智能编译器可能会应用RVO或N

c++ - 自动生成成员函数的 const 重载

我正在尝试在C++中实现D语言关键字inout的语义(只是为了好玩)。根据上下文,它基本上表示以下两种情况之一:“此函数的结果将与其参数之一具有相同的常量性。”“此成员函数的结果将与您调用它的实例具有相同的常量性。”在编写诸如begin和end等成员函数时非常有用。我能够相对轻松地创建第一种情况的有效实现(尽管界面确实不漂亮):http://ideone.com/wgaDJJ然而,根据我的最佳猜测,第二个似乎是不可能的。你只能在使用模板时获得这种“自动const重载生成”,但据我所知,你不能在“this”参数上进行模板化。特别是,您会注意到此代码不工作/编译:http://ideone

C++ 使用指向非 const 的指针编写 const vector

我正在编写一个CustomVector类,使用标准vector在内部存储数据:templateclassCustomVector{friendclassCustomVector_ref;public:...private:std::vector_data;};然后,为了从CustomVector中提取子vector,我使用了一个类来存储指向每个数据元素的指针:templateclassCustomVector_ref{public://ReturnsthevaluestoredinCustomVector//andpointed-toby_data_refT&operator[](si

c++ - 通过 const_cast 修改 const std::vector<T> 的元素

下面的程序是否有未定义的行为?#include#includestructFoo{conststd::vectorx;};intmain(){std::vectorv={1,2,3};autof=newFoo{v};const_cast(f->x[1])=42;//Legal?std::coutx[1]请注意,它不是使用const_cast从f->x中剥离常量,而是从f->中剥离常量x[x],大概由一个单独的数组表示。或者是否允许翻译假定f->x[1]在创建后是不可变的? 最佳答案 您的示例中没有未定义的行为。上面的代码不会调用未定

c++ - 'const' 双重复制+比较安全吗?

我注意到有很多关于浮点计算错误的讨论,这要求您使用比==更复杂的比较。然而,所有这些文章似乎都假设该值以某种方式被操纵(或双重计算),而我没有看到涵盖非常简单的常量复制的示例。请考虑以下事项:constdoublemagical_value=-10;classTest{double_val;public:Test():_val(magical_value){}boolis_special(){return_val==magical_value;}};据我了解,magical_value应该在编译时设置,以便在该点进行所有舍入。之后,将值复制到类中,并与原始值进行比较。这样的比较能保证安

c++ - 如何根据模板参数创建一个方法const?

我有一个带有模板参数的类,我想调用它的一个方法。它看起来像这样:templateclassFoo{public:voiddoSomething(){for(auto&t:ts){t.doSomething();}}private:std::vectorts;};这行得通,但如果T本身是常量,我想使doSomething()常量(假定T::doSomething()也将是const)。我找到了一个可能的解决方案(基于thisquestion),但我不喜欢它。template::value>typenamestd::enable_if::typedoSomething()const{for

c++ - C++ 中 Main 参数的 Const-Qualification

C++标准要求所有符合规范的实现都支持main的以下两个签名:intmain();intmain(int,char*[]);如果是后一种签名,添加(顶级)const是否会破坏任何语言规则?例如:intmain(constintargc,char**constargv);据我了解,顶级const限定不会影响函数的签名哈希,因此就规范而言它应该是合法的。此外,是否有人遇到过拒绝此类修改的实现? 最佳答案 这是一个knownissue在标准中。另见thisusenetdiscussion关于这个话题。

c++ - 为什么函数参数中的 const 限定符用于重载解析?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FunctionswithconstargumentsandOverloading我对重载和const声明规则感到很困惑。这里有两件让我困惑的事情,也许你能帮助我找到我头脑中更深层次的误解,这些误解导致我对它们感到困惑。;)第一期:我的编译器允许这样做:voidf(int&x){std::cout但是下面会导致编译错误(函数已经有主体):voidf(intx){std::cout我想这是有道理的,因为我认为const只是告诉编译器传递的对象没有改变,在第二种情况下它无论如何都会被复制。但如果这是正确的,那么为

c++ - 当一个方法只接受 Foo *const 时,我应该 const_cast "this"吗?

我有一个类Foo这是一个self引用的树状结构(最低限度):classFoo{public://Getsthischild'spositionrelativetoit'sparent.intgetPosition()const{returnparent->indexOf(this);}intindexOf(constFoo*constchild)const{returnchildren.indexOf(child);//thislinecausesanerror.}private:Foo*parent;QListchildren;}行returnchildren.indexOf(chi