我在Quora上看到在C++中将引用变量声明为常量.staticconstexprconstint&r=3;那么,为什么constexpr和const都用在一个语句中?这种声明的目的是什么? 最佳答案 const变量是在初始化后不能修改的变量(例如constinta=1)。constexpr变量是constantexpressions并且可以在编译时使用。将constexpr用于变量声明意味着const。但是,在此声明中,const适用于int,而constexpr适用于constint&(对constint的引用).
我有类,每个类都返回它的名字structIFoo{virtualconstchar*GetName()const=0;}structFoo:IFoo{constchar*GetName()const{return"Foo";}}structBar:IFoo{constchar*GetName()const{return"Bar";}}还有别的地方:Foo*a=newFoo();Foo*b=newFoo();std::mapdata;data[a->GetName()]=0;printf("%i",data[b->GetName()]);字符串文字应该存储在内存中的一个地方,但它是100
具体来说,我将CAPI包装在一个友好的C++包装器中。CAPI具有这种相当标准的形式:structfoo{...};voidget_foos(size_t*count,foo*dst);我想做的是,通过将类型双关的包装器数组直接传递给Capi来为自己保存一个额外的拷贝,并保持理智检查static_assert().classfooWrapper{fooraw_;public:[...]};std::vectorget_foo_vector(){size_tcount=0;get_foos(&count,nullptr);std::vectorresult(count);//Isthis
我正在尝试编写一个模板函数,它将汇总某个集合的所有元素——指定为普通STL容器,或指定为ranges-v3的范围。(实际功能,如下所示更通用一些)我认为这会起作用:templatestd::pairsum(constRange&range,Retzero,Funcextract){usingIt=decltype(range.begin());Retsum=zero;intnumElements=0;for(Itit=range.begin();it!=range.end();++it){sum+=extract(*it);++numElements;}return{sum,numEl
据我了解5.2.9静态转换中的措辞,void*-to-object-pointer转换的结果唯一允许的时间是void*首先是反向转换的结果。在整个标准中有一堆对指针表示的引用,void指针的表示与char指针的表示相同,等等,但它似乎从来没有明确地说转换任意void指针会产生指向内存中相同位置的指针,具有不同的类型,就像类型双关未定义而不是双关一样对象的实际类型。因此,虽然malloc清楚地返回了合适内存的地址等,但据我所知,似乎没有任何方法可以移植地实际使用它。 最佳答案 C++0x标准草案在5.2.9/13中有:Anrvalue
最近,我发现了一个有趣的讨论,讨论如何在不使用多个getter混淆设计的情况下允许对私有(private)成员进行只读访问,其中一个建议就是这样做:#includeclassA{public:A():_ro_val(_val){}voiddoSomething(intsome_val){_val=10*some_val;}constint&_ro_val;private:int_val;};intmain(){Aa_instance;std::cout输出:$./a.out0130GotW#66明确指出对象的生命周期开始whenitsconstructorcompletessucces
以下代码在GCC和Clang上生成警告:intmain(){unsignedn=0;return(n警告是:$g++-4.7-std=c++11-O3-Wall-Wextrat.cc-ott.cc:Infunction‘intmain()’:t.cc:3:16:warning:comparisonofunsignedexpression到目前为止,还不错。现在我将变量更改为const:intmain(){constunsignedn=0;return(n而且两个编译器突然很乐意在没有警告的情况下编译代码:$g++-4.7-std=c++11-O3-Wall-Wextrat.cc-ot$
我正在尝试从我正在处理的一些代码中删除c风格的强制转换,但我担心唯一的选择。原代码为:WPARAMparam=(WPARAM)(GetDlgItem(IDC_WORKFLOW).m_hWnd);this->PostMessage(WM_NEXTDLGCTL,param,TRUE);如果我使用静态转换:WPARAMparam=static_cast(GetDlgItem(IDC_WORKFLOW).m_hWnd);this->PostMessage(WM_NEXTDLGCTL,param,TRUE);我收到错误“static_cast”:无法从“HWND”转换为“WPARAM”,因为基础
考虑以下程序:#includeintmain(){intx=0;constint*px=new(&x)constint(0);x=1;std::cout它compilesunderGCC4.8(并产生“预期的”输出),但我怀疑它完全是UB,因为动态对象的类型为constint(whichremainspartofthetype)。但是,如果是的话,为什么编译器不阻止我违反const-correctness? 最佳答案 tl;dr:是的,这是未定义的行为。不,编译器不会对其进行诊断。一般来说,编译器不会(有时不能)诊断UB。const
我对这些说明符感到非常沮丧,因为我理解它们单独使用时的作用,但我发现当它们一起使用时很难理解。例如,野外的一些代码包含-namespace{staticconstexprcharconst*Hello[]={"HelloString","WorldString"};...}这到底有什么用?既然已经在匿名命名空间中,为什么还要使用static。静态内部类是有意义的(除非你正在编写缺少namespace的C),没有类-为什么??为什么使用constexpr-没有理由在这里使用它。一个简单的const就不行吗?然后const*Hello对我来说没有意义。这里不变的是什么?字符串或指针*Hel