草庐IT

Constants

全部标签

c++ - 头文件中的内联函数可以使用具有内部链接的常量吗?

考虑以下代码:constinta=0;conststd::stringb="hi";inlinevoidf_a1(){std::cout假设此代码存在于将包含在多个翻译单元中的头文件中。我对内联函数的理解是它们在每个翻译单元中必须完全相同。我对上面使用的常量的理解是,它们是隐含的static,即内部链接。这意味着每个翻译单元都有自己的拷贝。由于上面的内联函数依赖于这些常量,如果有的话,这些函数中哪些是正确的? 最佳答案 如果包含在多个翻译单元中,则唯一有效的函数是f_a1。相关子句是[basic.def.odr]/6,其中声明inl

c++ - 为什么C++允许从外部修改一个常量对象的指针成员变量的内存?

当我在C++中编写一个带有常量参数和该对象内部的指针变量的函数时,我一直在努力理解,而不是const标志不保护底层内存免受修改。例如,在名为X的类的operator=()函数中执行以下操作是完全合法的:classX{public:X&operator=(constX&other){this->data=other.data;//(*)return*this;}private:int*data;};(*):这与以下相同:int*some_pointer;int*constother_pointer=some_pointer;int*class_pointer=other_pointer;

c++ - 在 init 方法中绕过 const

所以我can'tuseinitializersinmyclassconstructor因为使用数组,所以我决定改用init()方法。现在我有一个不同的问题。我有这样一个类:classEPWM{private:volatileEPWM_REGS*constregs;public:voidinit(volatileEPWM_REGS*_regs);};我需要通过初始化regs=_regs;来实现init()但我不能因为const。有没有办法在我的init方法中强制分配?我想保留const关键字,这样我就不会不小心重新分配到别处。编辑:尽管我很想使用构造函数+初始值设定项来解决这个问题(我的

c++ - 常量变量的存储分配

我正在读一本提到这个的书Ifthecompilerknowseveryuseoftheconst,itneednotallocatespacetoholdit.Forexample:constintc1=1;constintc3=my_f(3);externconstintc4;Giventhatvaluesofc3andc4arenotknownascompiletime,storagemustbeallocatedforc3andc4.这些我都没看懂。我的疑惑是:留在这里是什么意思?难道它还需要把所有东西都存储在内存中吗?对于c1,我们不会有任何存储分配吗?请解开我的疑惑谢谢。

c++ - 对于类型 Class::Type,我可以从 const Class 派生 const Class::Type 吗?

我正在实现一个容器,例如:templateclassContainer{public:usingvalue_type=T;...};是否有从constContainer派生constvalue_type的好方法?背景:我已经通过嵌套模板类实现了迭代器类型:templateclassiterator_base{public:...Value&operator*()const;private:Container*c;};usingiterator=iterator_base;usingconst_iterator=iterator_base;工作正常,但iterator_base的第二个模

c++ - 静态常量类成员

我有很多常量需要在整个程序中引用。我一直在使用静态常量类成员,而不是使用全局变量:classHuman{public:staticconstintHANDS=2;staticconstintFINGERS=10;};问题是我需要从XML数据文件中读取值。我知道我可以用函数初始化静态成员:constintHuman::HANDS=ReadDataFromFile();由于只能在同一个编译单元中预测初始化的顺序,所以我必须将它们全部定义在同一个CPP文件中。这不是真正的问题,但它有点困惑。真正的问题是我的ReadDataFromFile()函数中的所有内容都需要在我的代码有机会运行之前准备

c++ - 当调用来自相同的非 const 版本重载成员函数时,是否可以删除 const 限定符?

例如:structB{};structA{constB&findB()const{/*somenontrivialcode*/}//B&findB(){/*thesamenontrivialcode*/}B&findB(){constA&a=*this;constB&b=a.findB();returnconst_cast(b);}};问题是我想避免在常量findB和非常量findB成员函数中重复相同的逻辑。 最佳答案 是的,您可以将对象转换为const,调用const版本,然后将结果转换为非const:returnconst_ca

c++ - 推导函数返回类型的常量

有没有办法判断函数返回的是常量值还是非常量值?decltype适用于引用,但不适用于非引用类型。#includetemplatestructprint_type;//undefinedintmain(){autolambda=[]()->constint{return0;};print_typedt;//print_typeprint_type::type>ro;//print_typereturn0;}我实现了一个std::tuple转换函数,它将在每个元组元素上调用一个函数对象,并将结果存储在一个由返回类型组成的新tuple中。这不适用于const返回类型,这非常令人惊讶(但需要)

c++ - 使用 const 键但非 const 值进行映射?

我有一种情况,我想要一个不允许在初始化后添加/删除键的映射,但允许更改值(因此我不能简单地使映射const).即/*semi-const*/mapmyMap=initMap();myMap[1]=2;//NOTOK,becausepotentiallyaddsanewkeymyMap.at(1)=2;//OK,becauseworksonlyifkeyispresentfor(auto&element:myMap){element.second=0;//OK,valuesmaychange}我可以为std::map编写我自己的包装器,但我觉得这并不少见,所以我想知道是否已经存在解决方案

c++ - const 双指针参数的非常量指针参数

C++中star之前的const修饰符意味着使用这个指针指向的值不能改变,而指针本身可以指向别的东西。在下面voidjustloadme(constint**ptr){*ptr=newint[5];}intmain(){int*ptr=NULL;justloadme(&ptr);}juSTLoadme函数不允许编辑传递的参数指向的整数值(如果有的话),但它可以编辑int*值(因为const不在第一个星之后),但为什么我在GCC和VC++中都会遇到编译器错误?GCC:错误:从int**到constint**的无效转换VC++:错误C2664:“juSTLoadme”:无法将参数1从“in