草庐IT

const_buffers

全部标签

c++ - 会不会是 sizeof(T*) != sizeof(const T*)?

我正在和我的老板争论这件事。他们说“是的,他们可以与众不同。”sizeof(T*)!=sizeof(constT*)是否可能用于类型T? 最佳答案 不,它们不可能不同。对于足够不同的T1和T2,sizeof(T1*)可以不同于sizeof(T2*),但如果T2只是constT1,那么:3.9.2Compoundtypes[basic.compound]3[...]Pointerstocv-qualifiedandcv-unqualifiedversions(3.9.3)oflayout-compatibletypesshallhav

c++ - 为什么 std::map 没有 const 访问器?

std::map上[]运算符的声明如下:T&operator[](constkey_type&x);不是这个有什么原因吗?T&operator[](constkey_type&x);constT&operator[]const(constkey_type&x);因为当您需要在const方法中访问成员映射时,这将非常有用。 最佳答案 从C++11开始,有std::map::at提供const和non-const访问。与operator[]相比,如果元素不在map中,它将抛出std::out_of_range异常。

c++ - 如果您已经知道变量应该是常量,为什么还要使用关键字 const?

当变量的值不应该被修改时,我正在阅读的许多书籍都使用关键字const。除了向代码的读者说明如果您修改此变量可能会导致错误(您可以使用注释来执行此操作),为什么您需要该关键字成为任何编程语言的一部分?在我看来,如果您不想修改变量,那就不要。有人可以为我澄清一下吗? 最佳答案 Apartfromspecifyingtoreadersofthecodethatyoumaycauseerrorsifyoumodifythisvariable(youcanusecommentstodothis)不是“可能”;会导致你的程序出错。C++编译器将

c++ - 为什么我不能在一个类中有一个非整数静态 const 成员?

我注意到C++不会编译以下内容:classNo_Good{staticdoubleconstd=1.0;};但是,它会很高兴地允许将double更改为int、无符号或任何整数类型的变体:classHappy_Times{staticunsignedconstu=1;};我的解决方案是将其更改为:classNow_Good{staticdoubled(){return1.0;}};并认为编译器将足够聪明,可以在必要时内联...但这让我很好奇。为什么C++设计者允许我静态const一个int或unsigned,而不是一个double?编辑:我在WindowsXP上使用VisualStudi

c++ - const 和非 const 键有什么区别?

下面两行有什么区别?mapmap_data;mapmap_data; 最佳答案 int和constint是两种不同的类型。std::map和std::map同样是不同的类型。std::map的区别和std::map在某种程度上,类似于std::map之间的差异。和std::map;您会为每个map类型获得新的map类型。在非const在这种情况下,内部key类型是仍然非constint:std::map::key_type=>constintstd::map::key_type=>int但是,映射键在语义上是不可变的,并且所有允许直

c++ - 返回对对象的 const 引用而不是拷贝

在重构一些代码时,我遇到了一些返回std::string的getter方法。例如这样的事情:classfoo{private:std::stringname_;public:std::stringname(){returnname_;}};当然,getter会更好地返回conststd::string&?当前方法正在返回一个效率不高的拷贝。返回一个const引用会导致任何问题吗? 最佳答案 这可能导致问题的唯一方法是调用者存储引用,而不是复制字符串,并在对象被销毁后尝试使用它。像这样:foo*pFoo=newfoo;conststd

c++ - 对 const 的右值引用有什么用吗?

我猜不是,但我想确认一下。constFoo&&有什么用,其中Foo是类类型? 最佳答案 它们有时很有用。C++0x草案本身在一些地方使用它们,例如:templatevoidref(constT&&)=delete;templatevoidcref(constT&&)=delete;上述两个重载确保其他ref(T&)和cref(constT&)函数不绑定(bind)到右值(否则可能)。更新我刚刚查了官方标准N3290,不幸的是,它没有公开可用,它在20.8函数对象[function.objects]/p2中:templatevoidr

c++ - 为什么有时不需要在 lambda 中捕获 const 变量?

考虑以下示例:#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”)。

c++ - `const auto` 有什么意义吗?

我认为这个问题已经很清楚了。auto关键字会自动检测const-ness,还是总是返回非const类型,即使有例如。函数的两个版本(一个返回const而另一个不返回)。为了记录,我确实在我的for循环之前使用了constautoend=some_container.end(),但我不知道这是否有必要甚至与普通自动。 最佳答案 constautox=expr;不同于autox=expr;作为constXx=expr;不同于Xx=expr;所以要经常使用constauto和constauto&,就像没有auto时一样。重载解析不受返回类

c++ - 对静态 const int 的 undefined reference

我今天遇到了一个有趣的问题。考虑这个简单的例子: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没有在任何地方