草庐IT

const_cast-ing

全部标签

c++ - 对 boost::gregorian::greg_month::as_short_string() const 的 undefined reference

这被问了好几次,但我不知道我做错了什么。我正在尝试将当前日期减去7。这是主要的:#include#include#include#includeusingnamespacestd;usingnamespaceboost::gregorian;intmain(intargc,char**argv){time_trawtime;structtm*timeinfo;time(&rawtime);timeinfo=localtime(&rawtime);datecdate(timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday);

c++ - 初始化 const 成员变量

我的C++代码可以归结为如下内容:classFoo{boolbar;boolbaz;Foo(constvoid*);};Foo::Foo(constvoid*ptr){conststructmy_struct*s=complex_method(ptr);bar=calculate_bar(s);baz=calculate_baz(s);}在语义上,bar和baz成员变量应该是const,因为它们在初始化后不应该改变。但是,似乎为了使它们如此,我需要在初始化列表中初始化它们而不是分配它们。明确地说,我理解为什么我需要这样做。问题是,如果不做以下不受欢迎的事情之一,我似乎找不到任何方法将代

c++ - 初始化 const 成员变量

我的C++代码可以归结为如下内容:classFoo{boolbar;boolbaz;Foo(constvoid*);};Foo::Foo(constvoid*ptr){conststructmy_struct*s=complex_method(ptr);bar=calculate_bar(s);baz=calculate_baz(s);}在语义上,bar和baz成员变量应该是const,因为它们在初始化后不应该改变。但是,似乎为了使它们如此,我需要在初始化列表中初始化它们而不是分配它们。明确地说,我理解为什么我需要这样做。问题是,如果不做以下不受欢迎的事情之一,我似乎找不到任何方法将代

c++ - static const std::map<string, int> vs if-elseif

我编写了一个将字符串转换为数字的函数。我看到了两种可能的写法:intconvert(conststd::stringinput){if(input=="one"){return1;}elseif(input=="two"){return2;}//etc.return0;}或者intconvert(conststd::stringinput){staticconstmaptable={{"one",1},{"two",2}//etc.}constautoresult=table.find(input);if(result==table.end()){return0;}returnresu

c++ - static const std::map<string, int> vs if-elseif

我编写了一个将字符串转换为数字的函数。我看到了两种可能的写法:intconvert(conststd::stringinput){if(input=="one"){return1;}elseif(input=="two"){return2;}//etc.return0;}或者intconvert(conststd::stringinput){staticconstmaptable={{"one",1},{"two",2}//etc.}constautoresult=table.find(input);if(result==table.end()){return0;}returnresu

c++ - 禁用 RTTI 的 dynamic_cast

我很想知道在禁用RTTI的情况下使用动态转换编译代码时会发生什么(在GCC上使用-fno-rtti或在VisualStudio上使用/GR-)。编译器是否“回退”到static_cast?由于(至少在VS上)它只会发出警告,所以编译后的代码会做什么?更具体地说,如果我在没有RTTI的情况下编译我确信dynamic_cast不会出错的代码(即dynamic_cast可以安全地替换为static_cast)喜欢这个:classA{/*...*/};classB:publicA{intfoo(){return42;}};//...A*myA=newB();intbar=(dynamic_ca

c++ - 禁用 RTTI 的 dynamic_cast

我很想知道在禁用RTTI的情况下使用动态转换编译代码时会发生什么(在GCC上使用-fno-rtti或在VisualStudio上使用/GR-)。编译器是否“回退”到static_cast?由于(至少在VS上)它只会发出警告,所以编译后的代码会做什么?更具体地说,如果我在没有RTTI的情况下编译我确信dynamic_cast不会出错的代码(即dynamic_cast可以安全地替换为static_cast)喜欢这个:classA{/*...*/};classB:publicA{intfoo(){return42;}};//...A*myA=newB();intbar=(dynamic_ca

c++ - 为什么使用 std::forward<T> 而不是 static_cast<T&&>

当给出以下结构的代码时templatevoidfoo(Args&&...args){...}我经常看到库代码使用static_cast在用于参数转发的函数中。通常,这样做的理由是使用static_cast避免不必要的模板实例化。给定语言的引用折叠和模板推导规则。我们通过static_cast获得完美的转发,此声明的证明如下(在误差范围内,我希望答案能启发)当给定右值引用时(或为了完整性-没有像thisexample中的引用限定),这会折叠引用,结果是一个右值。使用的规则是&&&&->&&(规则1以上)当给定左值引用时,这会折叠引用以使结果是左值。这里使用的规则是&&&->&(规则2以上

c++ - 为什么使用 std::forward<T> 而不是 static_cast<T&&>

当给出以下结构的代码时templatevoidfoo(Args&&...args){...}我经常看到库代码使用static_cast在用于参数转发的函数中。通常,这样做的理由是使用static_cast避免不必要的模板实例化。给定语言的引用折叠和模板推导规则。我们通过static_cast获得完美的转发,此声明的证明如下(在误差范围内,我希望答案能启发)当给定右值引用时(或为了完整性-没有像thisexample中的引用限定),这会折叠引用,结果是一个右值。使用的规则是&&&&->&&(规则1以上)当给定左值引用时,这会折叠引用以使结果是左值。这里使用的规则是&&&->&(规则2以上

c++ - 使用 std::vector< std::shared_ptr<const T>> 是反模式吗?

很长一段时间我都在使用std::vector和std::shared_ptr手牵手。最近开始使用std::shared_ptr每当需要指向const对象的指针时。没关系,因为std::shared_ptr可以转换为std::shared_ptr然后他们共享相同的引用计数器,一切都感觉很自然。但是当我尝试使用std::vector>等结构时我遇到了麻烦。为简化起见,我将表示这两种结构:templateusingSharedPtrVector=std::vector>;templateusingSharedConstPtrVector=std::vector>;问题是虽然SharedPtr