草庐IT

const_cast-ed

全部标签

c++ - const 变量的引用运算符 "&"的结果是什么?

我被问到如何改变常量变量的值。我的明显答案是“指针!”但我尝试了下一段代码,我很困惑......intmain(){constintx=5;int*ptr=(int*)(&x);//"Castaway"theconst-ness..cout输出是:Valueat:5Nowthevalueofis:6Butthevalueofxisstill5现在,我不确定从“&x”返回的到底是什么,但它绝对不是x的实际地址,因为x的值没有改变!但另一方面,ptr确实在开头包含x的值!那么,它到底是什么?EDIT用VS2010编译 最佳答案 您的程序

c++ - const void * 相对于 void * 提供什么值(value)?

在C++中,使用constvoid*作为函数的参数类型是否比void*更有值(value)?由于void*是不透明的,是否存在任何修改风险,除非用户执行reinterpret_cast,在这种情况下他们同样可以执行const_cast在constvoid*上,因此真的可以买任何东西吗?我问是因为我正在为共享指针使用实用程序模板类,它提供了void的专门化以避免void&问题,但没有为constvoid因此我想知道这是否只是一个疏忽,还是永远不需要它? 最佳答案 它提供了与const在其他指针类型上提供的相同的好处:除非您明确放弃co

c++ - 用户定义类型的 static_cast

这可能吗?为什么要这么做?classFoo;classBar;......Foofoo;Barbar=static_cast(foo);通常static_cast用于数字类型和指针,但它可以用于用户定义的数据类型,也就是类吗? 最佳答案 Barbar=static_cast(foo);此转换将失败。Foo和Bar是不兼容的类型,除非至少满足以下条件之一:Foo派生自Bar,或者Bar有一个接受Foo或Or的构造函数Foo具有到Bar的用户定义转换。这里更大的问题不是它是否会成功转换。更大和实际的问题应该是:你想从这样的Actor阵容

c++ - 与 const char * [] 声明关联的重复符号错误

我很乐意帮助诊断我在尝试使用g++4.2.1进行编译时收到的重复符号错误的来源。具体错误是ld:duplicatesymbol_SOCIODEM_FILENAMESin/var/folders/c+/c+eq1Qz1Feye7vxs5mQOUE+++TI/-Tmp-//ccP3yVgF.oand/var/folders/c+/c+eq1Qz1Feye7vxs5mQOUE+++TI/-Tmp-//cc1NqtRL.ocollect2:ldreturned1exitstatus仅当我将此声明包含在名为Parameters.h的文件中时才会发生错误://Parameters.h#ifndef

c++ - 将 C++ 变量声明为 const 是有助于还是损害性能?

我了解const限定数据类型的行为。不过,我很好奇,如果过度或不够热心地将限定变量作为const,是否会带来任何性能增益或损失。我特别考虑在隔离代码块中声明和使用的变量。例如,像这样的东西:constqrealpadding=CalculatePadding();constQSizeFpage_size=CalculatePagePreviewSize(padding);constQRectFcontent_rect=CalculatePagePreviewContentRect(page_size);constQListpages=renderer.BuildPrintPages(p

c++ - 在函数内声明 const 而不是变量有什么好处吗?

如果我有一个只存在很短时间的函数,将颜色列表设为常数会有什么不同吗?stringgetrandcolor(){conststringcolors[5]={"red","blue","green","yellow","purple"};returncolors[rand()%5];}注意:实际的颜色列表包含数百种颜色,而不仅仅是我展示的小样本,不确定这是否会有所不同。 最佳答案 它可以防止您不小心覆盖您不想更改的变量。“糟糕!”-保护可能是const最重要的功能。假设一个编译器可以通过知道一个变量不应该改变来预测某种优化,但我的测试从

c++ - 我可以举一个现实生活中的例子,其中通过 void* 进行强制转换而 reinterpret_cast 无效吗?

有一组关于交叉转换的问题(从T1*转换为不相关的T2*),例如this和this.答案通常是这样的:reinterpret_cast是实现定义的,转换为void*后跟static_cast是明确定义的。然而,我还没有看到使用reinterpret_cast时可能出错的任何真实示例。通过void*进行强制转换而reinterpret_cast无效的真实示例有哪些? 最佳答案 real-lifeexampleswherecastingthroughvoid*worksandreinterpret_castdoesn't如果我将这句话解释

c++ - 为什么 64 位 GCC 在分配数组时警告将 const int 转换为 long unsigned int?

我有一个如下所示的文件test.cpp:voidf(constintn){unsignedchar*a=newunsignedchar[n];delete[]a;}intmain(){f(4);return0;}使用-Wsign-conversion在64位GCC中编译它标志产生警告:test.cpp:2:39:warning:conversionto‘longunsignedint’from‘constint’maychangethesignoftheresult[-Wsign-conversion](第2行是调用new的行)。我觉得GCC应该发出关于分配数组的警告似乎很奇怪,但下面

具有用户类型的 C++20 模板 <auto> 导致 GCC 9 中的 T/const T 类型不匹配

我正在尝试将非类型模板与自定义类型结合使用。structT{};templatestructU{};templatevoidf(U){}intmain(){constexprTt;f(U{});//OKf(U{});//OKf(U{});//Error}模板参数推导失败,gcctrunkwith-std=c++2agetsyop.cpp:10:5:note:templateargumentdeduction/substitutionfailed:yop.cpp:19:21:note:mismatchedtypes‘T’and‘constT’19|f(U{});//Error|^我是不是

c++ - SFINAE: 'static_cast<void>()' 或 ', void()'?

在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void。我见过两种方法;转换为无效:(void)(expr)//orstatic_cast(expr)或者,或者,使用带有voidprvalueRHS的逗号运算符:(expr),void()据我了解,在这两种情况下,expr都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类T也无法覆盖T::operatorvoid()或operator,(T,void)。(参见:Whyis"operatorvoid"notinvokedwithcastsyntax?、Wha