草庐IT

constness

全部标签

c++ - 基于范围的循环 : get item by value or reference to const?

阅读一些基于范围的循环示例,他们提出了两种主要方法1,2,3,4std::vectorvec;for(auto&x:vec){//xisareferencetoanitemofvec//Wecanchangevec'sitemsbychangingx}或for(autox:vec){//Valueofxiscopiedfromanitemofvec//Wecannotchangevec'sitemsbychangingx}嗯。当我们不需要更改vec项目时,IMO,示例建议使用第二个版本(按值)。为什么他们不建议const引用的东西(至少我没有找到任何直接建议):for(autocons

c++ - 在 C++ 中通过值传递还是通过引用传递到 const 更好?

在C++中是通过值传递还是通过引用传递到const更好?我想知道哪种做法更好。我意识到通过引用传递到const应该可以在程序中提供更好的性能,因为您没有制作变量的拷贝。 最佳答案 过去通常建议最佳实践1对所有类型使用传递常量引用,内置类型(char、int、double等),用于迭代器和函数对象(lambdas,派生自std::*_function)。在移动语义存在之前尤其如此。原因很简单:如果按值传递,则必须制作对象的拷贝,除了非常小的对象外,这总是比传递引用更昂贵。使用C++11,我们获得了movesemantics.简而言之,

c++ - 为什么即使 T 的 value_type 是 const,std::is_const::value 也是 'false'?

#includestructfoo;intmain(){constfoo*bar;static_assert(std::is_const::value,"expectedconstbutthisisnon-const!");}这会导致static_assert失败,这是意料之外的。这有点类似于thisquestion在const引用上,但不完全相同。在我的例子中,取消引用bar应该给出一个constfoo的实例作为它的类型,但std::is_const却另有说明。 最佳答案 简而言之,这是因为指向const类型的引用或指针不是con

c++ - 为什么即使 T 的 value_type 是 const,std::is_const::value 也是 'false'?

#includestructfoo;intmain(){constfoo*bar;static_assert(std::is_const::value,"expectedconstbutthisisnon-const!");}这会导致static_assert失败,这是意料之外的。这有点类似于thisquestion在const引用上,但不完全相同。在我的例子中,取消引用bar应该给出一个constfoo的实例作为它的类型,但std::is_const却另有说明。 最佳答案 简而言之,这是因为指向const类型的引用或指针不是con

c++ - 调用 const 函数而不是其非 const 版本

为了我的目的,我尝试包装类似于Qt的共享数据指针的东西,经过测试,我发现应该调用const函数时,选择了它的非const版本。我正在使用C++0x选项进行编译,这是一个最小的代码:structData{intx()const{return1;}};templatestructcontainer{container(){ptr=newT();}T&operator*(){puts("nonconstdataptr");return*ptr;}T*operator->(){puts("nonconstdataptr");returnptr;}constT&operator*()const{

c++ - 调用 const 函数而不是其非 const 版本

为了我的目的,我尝试包装类似于Qt的共享数据指针的东西,经过测试,我发现应该调用const函数时,选择了它的非const版本。我正在使用C++0x选项进行编译,这是一个最小的代码:structData{intx()const{return1;}};templatestructcontainer{container(){ptr=newT();}T&operator*(){puts("nonconstdataptr");return*ptr;}T*operator->(){puts("nonconstdataptr");returnptr;}constT&operator*()const{

c++ - 将 const std::string & 作为参数传递的日子结束了吗?

我听到HerbSutter最近的一次演讲,他提出了通过const&传递std::vector和std::string的原因>基本上没有了。他建议现在最好编写如下函数:std::stringdo_something(std::stringinval){std::stringreturn_val;//...dostuff...returnreturn_val;}我知道return_val将是函数返回时的右值,因此可以使用非常便宜的移动语义返回。但是,inval仍然比引用的大小(通常实现为指针)大得多。这是因为std::string具有各种组件,包括指向堆的指针和用于短字符串优化的成员cha

c++ - 如何将 std::string 转换为 const char* 或 char*

如何将std::string转换为char*或constchar*? 最佳答案 如果您只想传递std::string对于需要constchar*的函数,您可以使用std::stringstr;constchar*c=str.c_str();如果你想得到一个可写的拷贝,比如char*,你可以这样做:std::stringstr;char*writable=newchar[str.size()+1];std::copy(str.begin(),str.end(),writable);writable[str.size()]='\0';/

c++ - const int*、const int * const 和 int const * 有什么区别?

我总是搞砸如何正确使用constint*、constint*const和intconst*。是否有一套规则来定义你能做什么和不能做什么?我想知道在分配、传递给函数等方面的所有注意事项。 最佳答案 向后阅读(由Clockwise/SpiralRule驱动):int*-指向int的指针intconst*-指向constint的指针int*const-指向int的const指针intconst*const-指向constint的const指针现在第一个const可以在类型的任一侧,所以:constint*==intconst*consti

c++ - 在 Qt 中发送信号时的 const-ref

这是我在const-ref中从未完全理解过的事情,我真的希望有人可以向我解释。当在另一个函数内部调用一个函数时,我知道const-ref是传递我不打算篡改的堆栈对象时的最佳方式。例如:voidsomeInnerFunction(constQString&text){qDebug()到目前为止一切都很好,我猜。但是信号呢?传递引用是否有任何风险?即使它是const。感觉就像我一直在阅读有关const-ref的所有文档,但我仍然觉得有点冒险,因为我将其理解为“发送对对象的引用并保留它const”。如果它所指的对象超出范围怎么办?例如:voidsomeFunction(){connect(t