草庐IT

const_cast-ing

全部标签

c++ - const 引用是否绑定(bind)到另一个从临时悬挂引用转换而来的引用?

下面是代码片段:#includeusingnamespacestd;structB{intb;~B(){cout在thisonlinecompiler输出是destructBdestructB1因此返回值似乎比cout操作更早析构。所以instance似乎是一个悬空引用。如果我们把constB&instance=(constB&)func();改成constB&instance=func();,那么结果就是destructB1destructB作为补充,如果我在vs2015中测试代码,那么输出的是最后一个。但是,如果在gcc(before4.6)中测试,输出是前者,但在4.6之后的版本

c++ - 从右值参数推导出对 const 的引用

好吧,这可能看起来像一个愚蠢的问题,但它是这样的:templatevoidfoo(T&x){}intmain(){foo(42);//errorinpassingargument1of'voidfoo(T&)[withT=int]'}是什么阻止C++使用T=constint实例化foo函数模板? 最佳答案 问题在于模板类型推导必须计算出精确匹配,并且在那种特定情况下,由于签名中的引用,精确匹配需要一个左值。值42不是左值,而是右值,解析T与constint不会产生完美的匹配。由于模板类型推导仅限于完全匹配,因此不允许推导。如果不使用

c++ - const 参数 "real"是常量吗?

AFAIK从const变量中删除constness是未定义的行为:constinti=13;const_cast(i)=42;//UBstd::cout但是const函数参数是“真正的”常量吗?让我们考虑以下示例:voidfoo(constintk){const_cast(k)=42;//UB?std::cout似乎编译器没有对constintk应用与constinti相同的优化。第二个例子有UB吗?constintk是帮助编译器优化代码,还是编译器只检查const的正确性,仅此而已?Example 最佳答案 constinti=1

c++ - reinterpret_cast 更改指针值的任何真实示例?

根据C++标准,指针T*到其他类型指针Q*的reinterpret_castcanchangeornotchangethepointervalue取决于实现。我非常感兴趣-是否有任何真实的C++实现示例,其中使用reinterpret_cast将指针转换为其他指针类型会更改指针?那里发生了什么变化以及为什么发生变化? 最佳答案 请注意,当标准声明它可以或不能做某事时,并不意味着当前有任何实现具有该行为,只是它们可以。我能想到的最接近的是硬件要求类型对齐的架构,以及决定在需要时纠正对齐的实现。像这样的东西:aligned8var;al

c++ - 是否有一种规范的方法允许将非 const 模板参数类型隐式转换为 const 类型?

我有一个接受特定模板类型参数的函数;简化版本可能如下所示:#includetemplatestructfoo{//defaultconstructorfoo(){}//simplecopyconstructorthatcanconstructafoofromafoo//orfoofoo(constfoo::type>&){}};功能上,foo行为类似于shared_ptr,以及与此问题无关的其他一些插件功能。该函数的语义决定它更喜欢接受foo。.foo可以从foo隐式构造,所以我希望能够执行以下操作:templatevoidbar(foof){}intmain(){bar(foo())

c++ - 通过构造函数传递和存储 const 引用?

这可能是一个简单的问题,但我坚持了下来。我试图通过它的构造函数将一个对象从ObjectA传递给ObjectB(它是ObjectA的成员)。但是,我不想按值传递,而是只想传递一个const引用并无限期地存储该引用。问题是我不确定该怎么做。我可以像这样使用指针让它工作:classClassB{private:int*ptrInternalX;public:ClassB(int*tempX);}ClassB::ClassB(int*tempX){ptrInternalX=tempX}这样,一个对象被创建并传递一个指向int的指针,该指针被存储在类中供以后使用。但是,指针让我担心在使用较大的对

c++ - static_cast 到相同类型会引入运行时开销吗?

我有一个结构模板,它采用两种类型(T和S),并且在某些时候使用static_cast从一种类型转换键入另一个。通常情况下,T和S是同一类型。设置的简化示例:templatestructfoo{voidbar(Tval){/*...*/some_other_function(static_cast(val));/*...*/}};在S与T是同一个类的情况下,static_cast是否会引入额外的开销,或者它是否为null哪个操作总是会被忽略?如果它确实引入了开销,是否有一个简单的模板元编程技巧来仅在需要时执行static_cast,或者我是否需要创建部分特化来处理T==S案例?如果可能,

c++ - c++ 中的复杂 dynamic_cast

我在C++中有以下情况:抽象基类Abstract1和Abstract2。它们是无关的。类Foo派生自Abstract1和Abstract2我在一个编译单元中,我没有关于类Foo的信息(没有声明,没有定义)。只有Abstract1和Abstract2是已知的。(实际上,Foo甚至定义在一个DLL中)dynamic_cast是否允许从Abstract1*转换为Abstract2*?这是标准吗? 最佳答案 你所描述的是所谓的cross-cast。对于dynamic_cast(v),标准在[expr.dynamic.cast]/8中指定If

c++ - 使用 const 成员放置 new 和类的赋值

为什么是未定义的行为?structs{constintid;//(引用标准会很好)。这个问题来自thisanswer. 最佳答案 显示的代码片段没有任何内在的UB。但是,几乎可以肯定,在任何正常使用情况下,UB都会立即出现。来自[basic.life]/8(强调我的)If,afterthelifetimeofanobjecthasendedandbeforethestoragewhichtheobjectoccupiedisreusedorreleased,anewobjectiscreatedatthestoragelocatio

c++ - 不是从 .begin()ing 迭代一个 STL 容器并环绕

我有一个std::vector,为了简单起见,让我们说整数。std::vectorivec;ivec.push_back(1);ivec.push_back(2);...//omittingsomepushback's3to99ivec.push_back(100);迭代的标准方式是已知的std::map::iteratorit;for(it=ivec.begin();it!=ivec.end();it++)print();该迭代将打印1,2,3,...100。我想从预定义的索引开始遍历所有vector元素,而不是从it.begin()开始。我要打印3,4,5,6...99,100,1