草庐IT

Constants

全部标签

c++ - 转换 Const 指针以使用遗留 C 代码

作为我之前问题(VariableLengthArrayPerformanceImplications(C/C++))的后续,我在使用C系统调用writev()维护const正确性时遇到了一些麻烦。也就是说,尽管我使用的是C++,但我似乎遇到了与该用户在C中遇到的完全相同的问题:https://codereview.stackexchange.com/questions/9547/casting-const-pointer-to-non-const-pointer-when-using-struct-iovec这是我的代码片段:intmy_awesome_transmit_functio

c++ - ctor 声明/定义中接受的 const 限定符(llvm 错误?)

我的编译器(实际上是AppleLLVM5.0版(clang-500.2.79)(基于LLVM3.3svn))接受(编译)该代码:classX{private:inti;public:constX(){cout它的工作方式就好像没有const限定符引导ctor定义一样。我尝试了-Wall、-pedantic不同类型的标准激活,总是一样的......所以:我错过了什么吗?我没能发现它在最新标准中的句法是正确的……这是gcc/llvm的错误吗?似乎gcc/llvm默默地忽略了const。这是我错过的功能吗?我的示例无法证明它的用处吗?注意:gcc3.4.3不编译它,gcc4.4.5也不编译。

c++ - 声明一个静态常量和一个常量到未命名的命名空间有什么区别?

据我所知,有两种方法可以声明一个只在一个文件中可见的常量变量:声明staticconstintVARIABLE=1在未命名的命名空间中声明它:namespace{constintVARIABLE=1;}那么有什么区别呢? 最佳答案 既然是const,那么两者都有内联,没有区别。因此,让我们考虑更有趣的情况,它不是const。在那种情况下,实际上没有什么区别。从技术上讲,第一个将具有内部链接,因此无法从另一个翻译单元访问该名称;第二个将具有外部链接,但不能从另一个翻译单元访问,因为它周围的namespace无法命名。

c++ - 为什么未初始化的 const 成员在 C 中的处理方式与在 C++ 中的处理方式不同?

这个问题在这里已经有了答案:constinCvsconstinC++(5个答案)关闭7年前。我为要链接的库包含一个Cheader。header有一个结构foo,我想在其中声明一个新变量bar。我收到编译器错误:error:uninitializedconstmemberin"structfoo"这些成员需要初始化是有道理的,因为以后不能为它们赋值。但是使用这个库的C程序可以做完全相同的事情并且它可以工作。C和C++标准有区别吗?这只是一个示例。实际上,我指的是libmtd.h(mtd-utils)中的结构mtd_dev_info。http://mtd-utils.sourcearchi

c++ - 为什么 const 类成员必须是静态的才能得到适当的优化?

给定:classFoo{constintx=5;public:inlineintget(){returnx;}};classBar{staticconstintx=5;public:inlineintget(){returnx;}};intfn0(Foo&f){returnf.get();}intfn1(Bar&b){returnb.get();}编译后的输出提供内存获取以读取fn0()中x的值,而添加static结果是文字5被内联到fn1()中。这意味着只有当整数常量为静态时,get()的调用方才可以像使用常量代替get()一样进行优化。我有更复杂的情况,其中static不合适。派生

c++ - 顶级或低级常量或两者都不是?

我正在处理C++Primer如果我理解正确的话:顶级常量适用于对象本身。低级常量意味着被引用对象是常量,这使得被引用对象成为顶级常量。//Aplainint.inti{0};//Top-levelconstints.constintci{42};constintci2{0};//Alow-levelpointertoconstint.constint*pci{&ci};//Low-level,becausethereferencedobjectcan'tbechanged.*pci=0;//error//Butnottop-level,becauseitcanbechangedtopo

c++ - const 应该用于捕获错误还是用于文档?

假设我有一个不可变类C。从用户的角度来看,我们永远无法更改任何C对象的功能行为。但是,出于性能原因,假设我们有一个toString方法可以将对象转换为字符串并返回它。我不想每次都做这个计算,所以我将结果存储在一个成员变量中,这样如果用户再次调用toString,它会很快。我是否使toString函数成为const(并且只使用const_cast来存储结果),因为只要我们将接口(interface)与实现,toString应该被视为不修改对象,或者我应该将它设为非常量,因为它会帮助编译器捕获错误? 最佳答案 拥有const对象的要点是

c++ - C++中的引用和常量混淆

这个问题在这里已经有了答案:assigningchartointreferenceandconstintreferenceinC++(3个答案)关闭5年前。我知道引用只是一个变量的另一个名字,它们在内存中并不作为一个单独的对象存在,但是这里发生了什么doublei=24.7;constint&ri=i;//noticeintherestd::cout我的问题是ri是什么的别名?[某处内存中的值24]

C++:覆盖已弃用的虚拟方法时的弃用警告

我有一个纯虚类,它有一个应该是const的纯虚方法,但不幸的是不是。该接口(interface)在一个库中,该类由单独项目中的几个其他类继承。我试图在不破坏兼容性的情况下(至少在一段时间内)使此方法成为const,但我找不到在非const方法重载时产生警告的方法。以下是到目前为止我能够生成的示例:第0阶段:变革之前。只有Interface::doSomething()方法的非常量版本存在,并且它是纯虚拟的。第1阶段:过渡期间。Interface::doSomething()方法的const和非const版本都存在。它们都有一个默认实现,以允许旧样式和新样式实现(在这个阶段它们不能是纯虚

c++ - 外部数组定义

我想在不同的cpp文件中定义字符串数组,但是当我尝试使指针(数组元素)也为const时,定义和声明之间似乎存在一些差异。使用与声明相同的定义似乎工作正常,所以我怀疑初始化不是问题。在下面的代码中,我注释掉了有问题的const-所以它会编译,但如果const未被注释,链接器(使用g++4.6和VS10测试)将找不到ext_string_array。main.cpp:#includeconstchar*conststring_array[2]={"aaa","bbb"};externconstchar*/*const*/ext_string_array[2];//定义.cpp:constc