我猜不是,但我想确认一下。constFoo&&有什么用,其中Foo是类类型? 最佳答案 它们有时很有用。C++0x草案本身在一些地方使用它们,例如:templatevoidref(constT&&)=delete;templatevoidcref(constT&&)=delete;上述两个重载确保其他ref(T&)和cref(constT&)函数不绑定(bind)到右值(否则可能)。更新我刚刚查了官方标准N3290,不幸的是,它没有公开可用,它在20.8函数对象[function.objects]/p2中:templatevoidr
考虑以下示例:#includeintmain(){constintm=42;[]{m;}();//OKconstintn=std::rand();[]{n;}();//error:'n'isnotcaptured}为什么我需要在第二个lambda中捕获n而不是在第一个lambda中捕获m?我检查了C++14标准中的第5.1.2节(Lambda表达式),但找不到原因。你能指出一个解释这一点的段落吗?更新:我在GCC6.3.1和7(主干)中都观察到了这种行为。Clang4.0和5(主干)在两种情况下都失败并出现错误(无法在未指定捕获默认值的lambda中隐式捕获变量“m”)。
我认为这个问题已经很清楚了。auto关键字会自动检测const-ness,还是总是返回非const类型,即使有例如。函数的两个版本(一个返回const而另一个不返回)。为了记录,我确实在我的for循环之前使用了constautoend=some_container.end(),但我不知道这是否有必要甚至与普通自动。 最佳答案 constautox=expr;不同于autox=expr;作为constXx=expr;不同于Xx=expr;所以要经常使用constauto和constauto&,就像没有auto时一样。重载解析不受返回类
我今天遇到了一个有趣的问题。考虑这个简单的例子:templatevoidfoo(constT&a){/*code*/}//Thiswouldalsofail//voidfoo(constint&a){/*code*/}classBar{public:staticconstintkConst=1;voidfunc(){foo(kConst);//Thisistheimportantline}};intmain(){Barb;b.func();}编译时出现错误:Undefinedreferenceto'Bar::kConst'现在,我很确定这是因为staticconstint没有在任何地方
我在C++中有以下类:classa{constintb[2];//otherstufffollows//andhere'stheconstructora(void);}问题是,我如何在初始化列表中初始化b,因为我无法在构造函数的函数体内初始化它,因为b是const?这不起作用:a::a(void):b([2,3]){//otherinitializationstuff}编辑:典型的例子是我可以为不同的实例设置不同的b值,但已知这些值在实例的生命周期内是恒定的。 最佳答案 使用C++11,这个问题的答案现在已经改变,您实际上可以这样做
在PHP和C#中,常量可以在声明时初始化:classCalendar3{constintvalue1=12;constdoublevalue2=0.001;}我有一个仿函数的以下C++声明,它与另一个类一起用于比较两个数学vector:structequal_vec{booloperator()(constVector3D&a,constVector3D&b)const{Vector3Ddist=b-a;return(dist.length2()这段代码用g++编译没有问题。现在在C++0x模式(-std=c++0x)下,g++编译器会输出错误消息:error:‘constexpr’n
这个问题在这里已经有了答案:Useof'const'forfunctionparameters(31个回答)关闭7年前。我在阅读我的C++书籍(Deitel)时遇到了一个计算立方体体积的函数。代码如下:doublecube(constdoubleside){returnside*side*side;}使用“const”限定符的解释是这样的:“const限定符应该用于强制执行最小权限原则,告诉编译器函数不修改变量端”。我的问题:这里使用“const”不是多余/不必要的,因为变量是按值传递的,所以函数无论如何都不能修改它? 最佳答案 c
我多次听到并阅读到,最好将异常捕获为对const的引用,而不是作为引用。为什么是:try{//stuff}catch(conststd::exception&e){//stuff}优于:try{//stuff}catch(std::exception&e){//stuff} 最佳答案 你需要:一个引用,以便您可以多态地访问异常一个const来提高性能,并告诉编译器你不会修改对象后者没有前者那么重要,但删除const的唯一真正原因是表明您想要对异常进行更改(通常只有在您想要将其与添加的上下文重新抛出到更高的级别)。
见主题。他们在想什么?更新:从“静态”更改为“内部链接”以避免混淆。举个例子...将以下内容放入文件中:constintvar_a=1;intvar_b=1;...用g++-ctest.cpp编译只会导出var_b。 最佳答案 我相信你的意思WhydoesconstimplyinternallinkageinC++确实,如果你在命名空间范围内声明一个const对象,那么它就有内部链接。附录C(C++11,C.1.2)给出了基本原理Change:Anameoffilescopethatisexplicitlydeclaredconst
我已经读过很多次了,在C或C++代码中强制执行const正确性不仅在可维护性方面是一个很好的做法,而且它还可以让你的编译器执行优化。但是,我也读到了完全相反的情况——它根本不影响性能。因此,您是否有示例说明const正确性可以帮助您的编译器提高程序的性能? 最佳答案 const正确性并不能提高性能,因为const_cast和mutable在语言中,并且允许代码符合地违反规则。这在C++11中变得更糟,您的const数据可能例如是指向std::atomic的指针,这意味着编译器必须尊重其他线程所做的更改。也就是说,编译器查看它生成的代