草庐IT

const_cast-ed

全部标签

具有原始类型的 C++ const 修饰符

我应该注意使用原始类型的const修饰符吗?哪一个在语法上更正确?为什么?第一版:floatFoo::bar(floata,floatb){return(a+b)/2.0f;}第二个版本:constfloatFoo::bar(constfloata,constfloatb){return(a+b)/2.0f;}第三个版本:floatFoo::bar(constfloata,constfloatb){return(a+b)/2.0f;}我知道原始类型的变量在传递给某些方法时被复制,但哪种方式更清楚? 最佳答案 我会说第三个版本是最“正

c++ - 不允许从 'const char *' 到 'void *' 的 static_cast

在C++中,我试图打印C字符串的地址,但我的转换似乎存在一些问题。我从一本书中复制了代码,但它无法在我的Mac上编译。constchar*constword="hello";cout(word) 最佳答案 你正试图抛弃“常量”:word指向常量数据,但static_cast的结果不是指向常量数据的指针。static_cast不会让你那样做的。你应该使用static_cast相反。 关于c++-不允许从'constchar*'到'void*'的static_cast,我们在StackOve

c++ - 为什么选择非常量版本而不是类的 const 版本?

测试代码如下:structA{operatorint();operatorint()const;};voidfoo(constint);现在,在调用时:foo(A());//callsA::operatorint()为什么会这样alwayschoosesthenon-constversion?即使使operatorconstint()const;对调用foo()也没有任何影响。除了标准引用,有人可以从逻辑上解释背后的原因吗? 最佳答案 A()为您提供一个非const限定的临时A对象。A()表达式是一个右值表达式,是的,但这不会使A对

C++ static_cast 的正确方法

static_cast不会抛出异常。但是如果不成功,它会产生一个未定义的结果。检查转换是否成功的最正确方法是什么?这会有帮助吗?NewTypenew_typ_obj=static_cast(obj);if(new_typ_obj)new_typ_obj.do(); 最佳答案 static_cast不会为您提供有关成功的信息。如果您需要进行动态类型转换,请使用dynamic_cast或类似boostany的库。 关于C++static_cast的正确方法,我们在StackOverflow上

c++ - 为什么从指向基的指针到指向派生的指针的 static_cast 是 "invalid?"

所以我有这段代码:Node*SceneGraph::getFirstNodeWithGroupID(constintgroupID){returnstatic_cast(mTree->getNode(groupID));}mTree->getNode(groupID)返回一个PCSNode*。Node公开派生自PCSNode。我在static_cast上找到的所有文档都说明了这一点:“static_cast运算符可用于将指向基类的指针转换为指向派生类的指针等操作。”然而,XCode的(GCC)编译器说从PCSNode*到Node*的static_cast无效且不允许。这是什么原因?当我

c++ - 'std::ios_base::ios_base(const std::ios_base&)' is private' 错误,同时为 std::ostram 重载运算符 <<

我有一个看起来像这样的结构:sturctperson{stringsurname;person(stringn):surname(n){};}我需要重载operator对于std::ostream和person.我写了这个函数:std::ostreamoperator但我收到此错误:/usr/include/c++/4.6/bits/ios_base.h|788|error:‘std::ios_base::ios_base(conststd::ios_base&)’isprivate|/usr/include/c++/4.6/bits/basic_ios.h|64|error:with

c++ - 为什么不能 static_cast 双空指针?

考虑以下代码:void**v_dptr(nullptr);int**i_dptr=static_cast(v_dptr);上面的例子产生以下编译错误:static_castfrom'void**'to'int**'isnotallowedLIVEDEMO我知道将void指针转换为任何其他指针类型的正确方法是使用static_cast。但是,您不能将双void指针static_cast指向另一个其他类型的双指针。问:为什么我们不能static_cast双void指针?转换双void指针的正确方法是什么? 最佳答案 当你有一个void*

c++ - 为什么我可以从 const 方法调用非 const 成员函数指针?

一位同事询问了一些像这样的代码,其中最初包含模板。我已经删除了模板,但核心问题仍然存在:为什么编译正常?#includeclassX{public:voidfoo(){std::cout鉴于CX是一个const对象,其成员函数execute是const,因此在CX::execute内部this指针是const。但我可以通过成员函数指针调用非常量成员函数。成员函数指针是常量世界中有记录的漏洞吗?我们错过了什么(对其他人来说可能是显而易见的)问题? 最佳答案 execute()的const特性只影响类的this指针。它使this的类型成

c++ - 强制 std::map 的键类型不是 const

C++引用告诉我们一个std::maptypedefpairvalue_type;是否可以强制key类型不是const?我需要在类似的模板方法中执行此操作template//Trepresentamapingeneral(std::map,boost::unordered_maporwhatever..)voidfoo(constT&m){typenameT::value_type::first_typex;x=0;//Wrongbecausexisconst...} 最佳答案 不,不是。这是因为map根据键执行其内部排序。如果您可

c++ - 为什么 strrchr() 返回 `char*` 而不是 `const char*` ?

函数char*strrchr(constchar*str,intch)返回char*内的指针(str)(constchar*)最后一次出现ch的地方位于。所以我们可以写出下面的代码而无需任何转换:#includeintmain(){constcharCONSTSTR[]="foo/bar/foobar.txt";char*ptr=strrchr(CONSTSTR,'/');*ptr++='B';*ptr++='A';*ptr++='D';}返回有什么好处char*而不是constchar*?编辑:作为ShafikYaghmour指出,Howdoesstrchrimplementatio