请考虑以下代码:voidfunc1(constint&i);voidfunc2(inti);voidf(){inta=12;func1(a);func2(a);}使用带有-O3的g++4.6编译,我可以看到编译器在函数调用之间重新读取“a”的值。将a的定义更改为“constint”,编译器不会这样做,而是简单地将立即值“12”加载到edi中。如果a不是const,也是如此,但我将func1的签名更改为按值接受。虽然不是代码生成中的错误,但这仍然是一种奇怪的行为。既然func1promise不改变a,编译器的代码为什么要根据a是否为const而改变?编辑:一些怀疑论者声称我可能读错了代码
考虑以下模板类:templateclassFunction{public:virtualfloateval(constT&x,constT&y)=0;};由于“eval”函数不应修改两个输入“x”和“y”的值,因此我将它们作为“const”。然后我创建以下派生自Function的类classFoo1:publicFunction{public:Foo1():Function(){}virtualfloateval(constfloat*&x,constfloat*&y){...}};当我用g++编译时,我收到以下警告:hiddenoverloadedvirtualfunction'Fu
我知道const和constexpr之间的区别。一个是编译时常量,另一个是编译时常量或运行时常量。但是,对于字符/字符串数组,我很困惑为什么编译器会提示一个被使用在另一个之上。例如我有:constexprchar*A[2]={"....","....."};constconstexprchar*B[2]={"....","....."};通过声明“A”我得到:ISOC++forbidsconvertingastringconstantto'char*'[-Wwrite-strings]但声明为“B”时,我没有收到任何警告。为什么额外的const限定符会消除警告?无论如何,它们都不都是“
我在使用view_facade(来自range-v3)创建提供常量和非常量访问的View时遇到问题。例如,我尝试修改view_facade测试(在test/view_facade.cpp中)以允许非const访问(默认情况下它只允许const访问):structMyRange:ranges::range_facade{private:friendstructranges::range_access;std::vectorints_;templatestructcursor{private:usingIt=typenamestd::conditional::const_iterator,
我有一个类模板A其中包含一个指针容器(T*):templateclassA{public://...private:std::vectordata;};还有一堆函数,比如:voidf(constA&);voidg(constA&);通过来自A的转换调用这些函数是否可以?至A?Aa;...auto&ac=reinterpret_cast&>(a);f(ac);我很确定这段代码有未定义的行为。在现实生活中使用这种转换是否危险? 最佳答案 尽管reinterpret_cast本身可能是未指定的行为,但在完成转换后尝试访问参数是未定义的行为
我想从一个带有const说明符的类继承,如下所示:classProperty{intget()const;voidset(inta);};classConstChild:publicconstProperty{//CannevercallA::set()withthisclass,evenif//theinstantiationofthisclassisnotconst};classNonConstChild:publicProperty{//CancallbothA::set()andA::get()dependingon//theconstnessofinstantiationof
如何特化具有参数常量引用的可变参数模板函数?例子:templateTfoo(Args...args)=delete;templateintfoo(inta,constchar*str,constTest&t){....}//Failstocompile//templateintfoo(inta,constchar*str,Test){....}//Okintmain(){autoi=foo(10,"teststring!",t);return0;}当使用声明的constTest&参数调用函数foo时,编译器无法看到专门的函数并回退到已删除的函数:error:useofdeletedfu
我有两个半密切相关的问题。给定一个作为模板参数传递的STL迭代器类型:如何判断类型对应的是常量迭代器还是非常量迭代器?替代1.,如何强制(例如使用enable_if)此类型对应于非常量迭代器?如何从非常量迭代器获取迭代器的const-版本(反之亦然)?[注意:已在thispost中回答;毫不奇怪,你不能。]这个问题来自哪里:我写了一个小类来促进vector上的算术/关系/代数运算(vector我的意思是一维固定大小的数据,而不是STLvector)。我没有强加一个特定的数据容器,而是定义了一个接口(interface)并派生了几个可能的容器,这些容器基本上“包装”了各种存储数据的方式。
我在看https://en.cppreference.com/w/cpp/language/reinterpret_cast我注意到它指定了我们始终可以转换为的合法类型:字节*char*unsignedchar*但是我没有在列表中看到void*。这是疏忽吗?我的用例需要reinterpret_cast,因为我正在从int**转换为void*。我最终将从void*转换回int**。 最佳答案 这些类型不受严格的别名规则约束。这并不意味着它们是您可以与reinterpret_cast一起使用的唯一类型.在将对象指针转换为另一种对象指针类
const_cast真的只是告诉编译器“停止提示,将其视为非常量指针”的一种方式吗?有没有const_cast本身被翻译成实际机器代码的情况? 最佳答案 不,它只是在编译时删除了const属性。 关于c++-const_cast是否会导致实际的代码排放?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/759315/