草庐IT

const_cast-ed

全部标签

c++ - 了解此 `const&` 特化的必要性

在指南支持库中有一个名为final_action的类(本质上就是众所周知的ScopeGuard)。有2个独立的便利函数可以生成这个模板类://finally()-conveniencefunctiontogenerateafinal_actiontemplateinlinefinal_actionfinally(constF&f)noexcept{returnfinal_action(f);}templateinlinefinal_actionfinally(F&&f)noexcept{returnfinal_action(std::forward(f));}(来源:https://g

c++ - const重载而不必写两次函数

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Elegantsolutiontoduplicate,constandnon-const,getters?假设我有一个带有成员函数的C++类,它为const重载,如下所示:Type*DoSomething();constType*DoSomething()const;如果这是一个更大、更复杂的成员,如何避免必须两次编写相同的代码?不能从常量函数调用任何非常量函数。从非const调用const版本会导致const指针必须转换为非const(imo有点味道)。

c++ - 成员函数什么时候应该有 const 限定符,什么时候不应该?

大约六年前,一位名叫HarriPorten的软件工程师写道thisarticle,问这个问题,“成员函数什么时候应该有const限定符,什么时候不应该?”我发现这是我能找到的关于这个问题的最好的文章,我最近一直在努力解决这个问题,我认为在我发现的关于const正确性的大多数讨论中都没有很好地涵盖这个问题。由于当时还没有像SO这样强大的软件信息共享站点,所以我想在这里重新提出这个问题。 最佳答案 这篇文章似乎涵盖了很多基础知识,但作者仍然对返回指针的函数的const和non-const重载有疑问。文章的最后一行是:许多人可能会回答“视

c++ - 使用 C++ 样式转换从 Void* 转换为 TYPE*​​ : static_cast or reinterpret_cast

因此,如果您从Void*转换为Type*或从Type*转换为Void*,您应该使用:voidfunc(void*p){Params*params=static_cast(p);}或voidfunc(void*p){Params*params=reinterpret_cast(p);}对我来说static_cast似乎更正确,但我已经看到两者用于同一目的。此外,转换的方向是否重要。即我是否仍应将static_cast用于:_beginthread(func,0,static_cast(params)我已经阅读了关于C++样式转换的其他问题,但我仍然不确定这种情况下正确的方法是什么(我认为

C++ const public 字段与 getter 方法

我想为某个类的每个对象添加唯一ID(在单个session中)。一种解决方案是使用增加一些静态计数器的工厂函数。一个更简单的解决方案是将这个计数器添加到类本身,例如:classfooWithUniqueId{public:fooWithUniqueId():id(next_id++){...};longid;private:staticlongnext_id=0;}然而,一个缺陷是id字段是公共(public)的,并且可以由调用者更改,因此违反了它的唯一性。传统的(好吧,至少在我看来)是将id设为私有(private),并使用getter函数来访问它,因此:classfooWithUni

C++ 通过 const 引用语法传递

我知道通过引用传递与通过指针传递的主题被大量覆盖......在我读到这篇文章之前我很确定我理解了所有的细微差别:http://carlo17.home.xs4all.nl/cpp/const.qualifier.html上面写着(以防链接失效)Theprototypeforfoobarcanhaveanyofthefollowingfootprints:voidfoobar(TYPE);//Passbyvaluevoidfoobar(TYPE&);//Passbyreferencevoidfoobar(TYPEconst&);//PassbyconstreferenceNotethat

c++:静态断言检查使用的const是否在预定义列表中

如何解决这个问题:我有预定义的常量整数列表:constautonumbers={1,5,10};我想使用static_assert(编译时)来检查是否有其他一些常量值:#defineSOME_IDENTIFIER1在列表中。你会怎么做?可能吗?谢谢! 最佳答案 C++2a:constexprstd::arraynumbers{1,5,10};constexprintsome_id=1;static_assert(std::any_of(numbers.begin(),numbers.end(),[](constauto&x){ret

C++ 字符串文字与 const 字符串

我知道C/C++中的字符串文字具有静态存储持续时间,这意味着它们“永远存在”,即只要程序运行。因此,如果我有一个被非常频繁调用的函数并且使用像这样的字符串文字:voidfoo(intval){std::stringstreams;sset_label("Value:"+s.str());}其中set_label函数将conststd::string&作为参数。我应该在这里使用conststd::string而不是字符串字面值,还是没有区别?我需要尽可能减少运行时内存消耗。编辑:我的意思是将字符串文字与在某种常量头文件中初始化的conststd::stringprefix("Value:

c++ - 与 const 相反 - 换句话说,一个 writeonly 限定符?

我正在阅读Stroustrup的c++FAQ我注意到,有一次,他在语言中有一个writeonly限定符。经过一番讨论,我和一位同事只能想出一个目的——副作用,特别是在某些内存映射IO的情况下。writeonly限定符还有其他合法用法吗? 最佳答案 write-only限定符对于硬件寄存器很有用,因为从write-only寄存器读取会导致未定义的行为或细微的运行时错误。您可以使用#define,例如#definewrite-only,然后将其应用于寄存器,例如special_registerwrite_onlyUTXBUF;EETim

c++ - Const 右值编译器区别

考虑这段代码:#includevoidf(int&&i){std::cout如果我用MSVC2012编译它,输出是:f(int&&)f(constint&&)如果我用GCC4.7编译,输出是:f(int&&)f(int&&)哪个是正确的?(如果我删除f的第二个定义,程序将无法在MSVC2012下编译,但可以在GCC4.7下编译。) 最佳答案 海湾合作委员会是正确的。来自3.10左值和右值[basic.lval]的第4段:Classprvaluescanhavecv-qualifiedtypes;non-classprvaluesalw