草庐IT

const_cast-ing

全部标签

c++ - 从 Derived* 到 void* 到 Base* 的 static_cast

我想将指向派生类成员的指针转换为void*,然后从那里转换为基类的指针,如下例所示:#includeclassBase{public:voidfunction1(){std::cout(&d);Base*baseptr=static_cast(ptr);baseptr->function1();baseptr->function2();}这会编译并给出所需的结果(分别打印1和2),但它能保证工作吗?我在这里找到的static_cast的描述:http://en.cppreference.com/w/cpp/language/static_cast只提到转换为void*并返回到指向相同类

C++:Cast 运算符重载和引用

C++允许通过创建operatorT()来重载类型转换,其中T是我们要转换为的类型。现在,这个功能如何与引用一起发挥作用?例如:structY{inti;};structX{Yy;operatorY()const{returny;}};在这里,我们可以将X转换为Y,这将简单地返回包含的Y。但是,如果我们想转换为Y引用怎么办?例如,C++允许我们这样做:structX{Yy;operatorY&(){returny;}operatorconstY&()const{returny;}};现在,我们可以将X转换为Y引用或const引用(这也适用于constX)。第一个和第二个例子在语义上有什

c++ - 为什么通过 const 引用传递 constexpr 对象有效,但按值不编译

我有下面的代码,它基本上映射了一个std::integer_sequence进入std::array在编译时:#include#include#includetemplateconstexprautomake_array(conststd::integer_sequence¶m)//thisworks*///constexprautomake_array(std::integer_sequenceparam)//doesn'tcompile{returnstd::array{Is...};}intmain(){constexprstd::integer_sequenceiseq

c++ - 将对临时/匿名 lambda 的 const 引用传递给 std::thread 构造函数是否安全?

从这个问题开始:can-a-temperary-lambda-by-passed-by-reference?我有一个固定的代码片段://globalvariablestd::threadworker_thread;//Templatefunctiontemplatevoidstart_work(constFunctor&worker_fn)//lambdapassedbyconstref{worker_thread=std::thread([&](){worker_fn();});}这样调用:voiddo_work(intvalue){printf("Hellofromworker\r

c++ - 使用非 const 指针调用函数比使用指向 const 的指针的函数更像是一个模板函数

以下代码是在g++4.1.2和g++4.4.4上编译的。两者都给出了评论中注明的结果。intf(constint*a){return0;}templateintf(Aa){return1;}intmain(){intx;//returnf(&x);//returns1returnf((constint*)&x);//returns0}它似乎归结为调用f(int*)解析为f(int*)而不是预期的f(constint*).我发现这令人震惊并且完全不符合直觉。这是g++中的一个错误,C++的一个黑暗角落,还是由于某种原因我遗漏了?如果它不是错误,它背后的理论或逻辑是什么?关于这个问题有什么

c++ - const 数组类成员初始化

这个问题在这里已经有了答案:initializeaconstarrayinaclassinitializerinC++(10个答案)关闭2年前。如何初始化常量整型数组类成员?我认为在同样的情况下,经典数组不是最佳选择,我应该用什么来代替它?classGameInstance{enumSigns{NUM_SIGNS=3;};constintgameRulesTable[NUM_SIGNS][NUM_SIGNS];//howtoinitit?public:explicitGameInstance():gameRulesTable(){};};

c++ - 全局 const char* 上的错误 LNK1169

我在使用VisualStudio2010和C++时遇到了一些奇怪的行为。我有一个头文件,我在其中声明了一些全局常量#ifndefCONSTANTS_H#defineCONSTANTS_H#defineWIN32_LEAN_AND_MEAN//Macros...#defineSAFE_RELEASE(ptr){if(ptr){ptr->Release();ptr=NULL}}#defineSAFE_DELETE(ptr){if(ptr){deleteptr;ptr=NULL;}}//Constants...constchar*CLASS_NAME="WinMain";constcharG

c++ - const 参数 vs const 引用参数

实现1:foo(constBarx);实现2:foo(constBar&x);如果对象不会在函数内更改,为什么要复制它(实现1)。这会被编译器自动优化吗?总结:即使对象在函数声明中被声明为const,仍然有可能通过其他别名&.如果您是库的编写者并且知道您的函数不会那样做或者对象足够大以证明每次操作的取消引用成本是合理的,那么foo(constBar&x);是要走的路。第2部分:Willthisbeautomaticallyoptimizedbythecompiler?由于我们确定它们并不总是等价的,并且等价的条件很重要,因此编译器通常很难确保它们,所以几乎可以肯定没有

c++ - 什么是 (void*) casting?

我确实尝试在StackOverflow上搜索此内容,但我认为由于语法原因以及不知道要搜索的确切内容,我有点不知所措。我见过(void*)被用来转换,通常是函数调用。这是做什么用的? 最佳答案 void*,通常称为void指针,是一种通用指针类型,可以指向任何类型的对象。指向不同类型对象的指针在内存中几乎相同,因此您可以使用void指针来避免类型检查,这在编写处理多种数据类型的函数时非常有用。空指针在C中比在C++中更有用。您通常应该避免使用void指针,而是使用函数重载或模板。类型检查是个好东西!

c++ - static_cast<T> 对 T& 做了什么?

所以我问了thisquestion我正在尝试通过static_cast解决它。(顺便说一句,它确实解决了问题,我只是不确定我是否理解为什么。)在代码中:vectorfoo={0,42,0,42,0,42};replace(begin(foo),end(foo),static_cast(foo.front()),13);static_cast是否只是构造一个R值int?那和只是打电话有什么区别:replace(begin(foo),end(foo),int{foo.front()},13);编辑:根据答案static_cast的推断,确实似乎构造了一个R值int:http://ideon