一个类型有两个const会发出警告/错误。但是,如果类型已使用typedef定义,编译器会接受它(VisualStudio2013和在线编译器C++shell)。#includetypedefconstintvalue_type;intmain(){constvalue_typen=0;//okconstconstintn2=0;//errorC4114return0;}有人知道为什么吗?是不是那个是const(constint),和constconstint不一样? 最佳答案 在typedef情况下明确允许,而在声明本身中不允许:
中的一些类型转换也可以使用核心语言语法来表达(例如std::add_const::type是/似乎等同于constT)。std::add_lvalue_reference的Dtto,也许还有其他人。这些类型特征有什么用?我完全理解,如果没有它们,标准将提供一个“不完整的工具箱”,我可以想象以元方式使用,如下所示:templateclassModifier>structApply{typedeftypenameModifier::typeOut;};Apply这些特征是否还有其他可以用句法表达的用例,或者它们只是“出于完整性感”而包含在偶尔的元使用中? 最佳答
现在我有一个必须返回字符串的函数。我看到了一个特殊的实现,他从函数中返回了一个constchar*。类似这样的:constchar*GetSomeString(){........returnsomestlstring.c_str();}SomeOtherFoo(){constchar*tmp=GetSomeString();strings=tmp;}现在我觉得这可能有问题。我的直觉对吗?还是这是一个完全安全的代码?请给我你的建议。我有一种感觉returnconstchar*这种方式可能会导致严重破坏..谢谢,阿琼 最佳答案 取决于
C++方法允许使用const限定符来指示该方法不会更改对象。但是,这是什么意思?例如。如果实例变量是指针,是指针没有改变,还是它们指向的内存没有改变?具体来说,这是一个最小的示例类classmyclass{int*data;myclass(){data=newint[10];}~myclass(){delete[]data;}voidset(constintindex)const{data[index]=1;}};方法set是否正确地限定为const?它不会改变成员变量data,但确实会改变数组的内容。 最佳答案 Whatcana'
考虑以下代码:voidfoo(boolparameter){std::cout我希望编译器在将constchar*而不是bool作为参数传递给函数foo时发出警告。但GCC会隐式转换它。我尝试了-Wall、-Wextra和-Wpedantic,但这些都没有发出警告。有没有可以捕捉到这种隐式转换(无效参数类型)的标志?忽略函数具有bool类型的参数这一事实,有些人可能会认为这是不好的代码风格。我无法重构那部分。标准只是提到了这样一个implicitconversion会发生:Aprvalueofintegral,floating-point,unscopedenumeration,poi
我已经阅读了大量关于应用程序中涉及智能指针时的性能问题的讨论。常见的建议之一是将智能指针作为const&而不是拷贝传递,如下所示:voiddoSomething(std::shared_ptro){}对voiddoSomething(conststd::shared_ptr&o){}但是,第二个变体实际上不是破坏了共享指针的目的吗?我们实际上在这里共享共享指针,因此如果由于某些原因指针在调用代码中被释放(考虑可重入性或副作用),则const指针将变为无效。共享指针实际上应该防止的情况。我知道const&节省了一些时间,因为不涉及复制,也没有锁定来管理引用计数。但代价是代码的安全性降低了
这个问题在这里已经有了答案:Whatshouldmain()returninCandC++?(19个回答)关闭4年前。标准明确规定main有两个有效(即保证工作)签名;即:intmain();intmain(int,char*[]);我的问题很简单,以下内容是否合法?intmain(constunsignedint,constchar*const*argv);我的测试说"is",但我不确定答案,因为我没有通过将int更改为unsignedint来重载main>以及argv的非顶级const-ness?如果我是,那显然是禁止的。那么,这些修改是否可以保证在符合标准的编译器上工作?
我正在读一本关于C++的书,更准确地说是关于运算符重载的书。示例如下:constArray&Array::operator=(constArray&right){//checkself-assignment//ifnotself-assignmentdothecopyingreturn*this;//enablesx=y=z}书中提供的关于返回constref而不是ref的解释是为了避免像(x=y)=z这样的赋值。我不明白我们为什么要避免这种情况。我知道在此示例中首先评估x=y,并且由于它返回一个const引用,因此=z部分无法执行。但为什么呢? 最佳答案
我看到有人在一个答案中使用这个:voidmethodA(constint*&var);我不明白这个论点是什么意思。阿法伊克:constintvar=>constint值无法更改constint*var=>指向constint的指针,即*var不能更改但var可以改constint&var=>引用constint,即var的值不能改变constint*&var是什么意思?constint&*var也可以吗?您能否也举一些例子,比如可以用它做什么和不能做什么?更新:我不确定我的想法是否正确,但我开始将引用视为作为参数传递的变量的别名,所以:constint*p;methodA(p)=>这里
我正在切换到GCC4.6.1,它开始提示在GCC4.4和MSVC10上运行良好的代码。从这样的函数返回时,它似乎不想在shared_ptr和bool之间进行转换:classClass{shared_ptrpointer_;};boolClass::Function()const{returnpointer_;}使用returnstatic_cast(pointer_);一切正常。到底他妈发生了什么?这是--std=cpp0x. 最佳答案 在C++11中,shared_ptr有一个explicitoperatorbool这意味着sha