草庐IT

const_cast

全部标签

c++ - 在编译时填充 std::array 和 const_cast 可能的未定义行为

已知std::array::operator[]由于C++14是constexpr,请参见下面的声明:constexprconst_referenceoperator[](size_typepos)const;但是,它也是const限定的。如果您想使用std::array的下标运算符以便在编译时为数组赋值,这会产生影响。例如考虑以下用户文字:templatestructFooLiteral{std::arrayarr;constexprFooLiteral():arr{}{for(inti(0);i如果您尝试声明类型为FooLiteral的constexpr变量,上述代码将无法编译。这

c++ - `std::any_cast` 返回拷贝

我正在阅读documentationforstd::any_cast我觉得很奇怪,API让转换要么返回一个值给持有的对象,要么返回一个指向它的指针。为什么不返回引用?每次使用非指针类型参数调用函数时都需要创建一个拷贝。我可以看到指针版本的转换可能更能表明意图,也可能更清晰,但为什么不让返回值成为这样的引用呢?templateValueType&any_cast(any*operand);代替templateValueType*any_cast(any*operand);此外,即使您请求引用,强制转换也会删除引用并将拷贝返回到存储的对象,请参阅此处对函数重载1-3的返回值的解释http:

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' 是否取消了通用引用的资格?

我有一个使用通用引用的ctor的人类类classHuman{public:templateexplicitHuman(T&&rhs){//dosomeinitializationwork}Human(constHuman&rhs);//thedefaultctorIdon'tcareabout}现在如果我有一个constHuman对象constHumanone_I_do_not_care;//thenplaywiththatHumanthe_human_I_care(one_I_do_not_care)//nowcreateanotherone最后一行是使用模板构造函数还是默认构造函数

c++ - 如何使用 const 键复制 unordered_map?

简单代码:#includeintmain(){std::unordered_mapm;std::unordered_mapm1=m;}产生复杂的编译错误信息:ErrorC2280'std::hash::hash(void)':attemptingtoreferenceadeletedfunction在其内部基本上说unordered_map并不期望key是常量附言:我读过answer对于类似的问题:Theassociativecontainersonlyexposethe(key,value)pairasstd::pair,sotheadditionalconstonthekeytyp

c++ - 为什么重写方法并将 const 添加到参数类型有效?

这个问题在这里已经有了答案:FunctionswithconstargumentsandOverloading(3个答案)关闭3年前。考虑以下示例:#include#includeclassBase{public:virtualvoidfunc(inta){}};classDerived:publicBase{public:voidfunc(constinta)override{}};intmain(){Derivedd;d.func(1);return1;}我重写了func方法,但将const添加到参数中,在这种情况下,链接器应该尖叫说出现了问题。要么函数没有被覆盖,要么函数参数不应

c++ - 如何使用 boost::any_cast 转换为基本类型?

我正在使用boost::any来获得多态类型,我需要能够将对象转换为其基类型。classA{public:intx;virtualintfoo()=0;};classB:publicA{public:intfoo(){returnx+1;}};intmain(){B*bb=newB();boost::anyany=bb;bb->x=44;A*aa=boost::any_cast(any);}main函数的代码在运行时抛出如下错误:terminatecalledafterthrowinganinstanceof'boost::exception_detail::clone_impl>'w

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

c++ - 我该如何改进这种强制我声明成员函数 const 并声明变量可变的设计?

出于某种原因,我在std::set中迭代一个类的元素,并且想稍微修改键,因为我知道顺序将保持不变。std::set上的迭代器是const_iterators,因为如果键被修改,可能会导致顺序错误,从而导致集合损坏。但是我确信我的操作不会改变集合中元素的顺序。目前,这是我的解决方案:classFoo{public:Foo(inta,intb):a_(a),b_(b){}~Foo(){}booloperators;//loopandinsertmany(distinctona_)Fooelements;std::for_each(s.begin(),c.end(),[](constFoo&

c++ - 为什么 std::make_pair 按值而不是 const 引用获取输入?

引用本网站http://www.cplusplus.com/reference/std/utility/make_pair/std::make_pair具有此签名(和可能的实现):templatepairmake_pair(T1x,T2y){return(pair(x,y));}我想知道为什么std::make_pair的输入参数是按值而不是常量引用?这有什么特别的原因吗? 最佳答案 它最初是通过const引用获取参数,但这引入了一些意想不到的问题。缺陷报告后改为按值传递:http://www.open-std.org/jtc1/s