草庐IT

Constants

全部标签

c++ - 为什么设置一个 const 变量(将以相同的值存储)在划分后会导致不同的结果?

漂亮的basic代码:#includeintmain(){std::cout.precision(100);doublea=9.79999999999063220457173883914947509765625;doubleb=0.057762265046662104872599030613855575211346149444580078125;constdoublebConst=0.057762265046662104872599030613855575211346149444580078125;doublec=a*b;std::cout哪些输出:a:9.79999999999063

C++ static const 和初始化(有没有惨败)

我在久违后重返C++,我对众所周知的静态初始化问题的理解有些磕磕绊绊。假设我有一个简单的类Vector2,如下所示(请注意,我知道x和y应该与getter和setter私有(private),为简洁起见,这些只是被省略了):classVector2{public:Vector2(floatx,floaty):x(x),y(y){};floatx,y;}现在,如果我想指定一个静态常量成员来表示x和y设置为1的Vector2,我不确定如何进行——静态常量成员是否会陷入静态初始化问题或让他们const意味着他们还好吗?我正在考虑以下可能性:可能性一://.hclassVector2{publ

c++ - C++ 中的常量指针变量

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:Whatisthedifferencebetweenconstint*,constint*const,andintconst*?我知道C++中指针变量的两种变体.说我有mystruct{intnum;}变体1:constmystruct*m1;表示m1中的成员变量不能被修改,例如m1->num=2会报错。变体2:mystruct*constm2=m1;表示一旦m2设置为指向m1,如果您随后设置m2=m3将产生错误。但是,似乎还有第三种变体,我不确定它的属性:变体3:mystructconst*m3;这是什么意

c++ - 改变 const std::string 引用的引用

我正在研究C++中的引用,并注意到一些我无法解释的奇怪行为。我的理解是,如果我有一个非常量变量和对同一变量的const引用,然后修改非常量变量,该引用应该反射(reflect)该修改。例子:voidfoo(){intx=5;constint&y=x;x=10;std::cout为我生成以下输出:x=10y=10但是,如果我将类型更改为std::string,const引用似乎不会反射(reflect)修改后的变量:voidfoo(){std::stringx="abc";conststd::string&y=x;x="xyz";std::cout为我生成以下内容:x=xyzy=abc这

c++ - 修复(锁定)std::vector 的大小

有没有一种方法可以固定vector的大小并仍然改变内容?我尝试制作一个constvectorconststd::vectorvec(10);但这会阻止我更改值。vec[3]=3;给出编译器错误:分配只读位置。我也尝试过对非常量vector的常量引用std::vectorvec(10);conststd::vector&vecref(vec);这给出了相同的编译器错误。我希望能够在声明时或初始化阶段后修复vector大小。我可以使用老式数组,但我希望能够使用vector算法。如果有任何不同,我正在使用g++。 最佳答案 在C++0x中

c++ - extern 在命名空间中如何工作?

我正在运行一个类似于我发现的简单程序here.它旨在减少在多个文件中包含常量时的代码膨胀。它通过在命名空间中使用const全局变量及其各自的extern前向声明来实现这一点。globals.h#ifndefGLOBALS_H_#defineGLOBALS_H_namespaceConstants{//forwarddeclarationsonlyexternconstdoublepi;externconstdoubleavogadro;externconstdoublemy_gravity;}#endif全局变量.cppnamespaceConstants{//actualglobal

C++ this 和常量对象

你能告诉我为什么这段代码有效吗?replace_if算法使用了重载的operator()。在main函数中,我创建了IsEqual类的常量对象,因此只应使用常量函数成员。不知何故,恒定性不起作用,该运算符被调用。#include#include#includeclassIsEqual{intvalue;public:IsEqual(intv):value(v){}booloperator()(constint&elem){this->value=6;returnelem==value;}};intmain(){constIsEqualtst(2);std::vectorvec={3,2

c++ - span 是否传播 const?

标准容器传播常量。也就是说,如果容器本身是常量,则它们的元素自动是常量。例如:conststd::vectorvec{3,1,4,1,5,9,2,6};ranges::fill(vec,314);//impossibleconststd::listlst{2,7,1,8,2,8,1,8};ranges::fill(lst,272);//impossible内置数组也传播常量:constintarr[]{1,4,1,4,2,1,3,5};ranges::fill(arr,141);//impossible但是,我注意到std::span(大概)不会传播const。最小可重现示例:#inc

c++ - 为什么在丢弃指向该对象的指针的常量之后写入一个非常量对象而不是 UB?

根据C++标准,如果对象本身不是const,则可以从指针中丢弃const并写入对象。这样:constType*object=newType();const_cast(object)->Modify();没关系,但是这个:constTypeobject;const_cast(&object)->Modify();是UB。Thereasoningis当对象本身是const时,允许编译器优化对其的访问,例如,不执行重复读取,因为重复读取对未更改的对象没有意义。问题是编译器如何知道哪些对象实际上是const?比如我有一个函数:voidfunction(constType*object){con

c++ - 在构造函数 C++ 标准中修改 const 吗?

在构造函数中修改const是C++标准吗?我正在修改我的struct删除固定值(默认成员初始值设定项)以便稍后在构造函数时设置它但我忘记删除const关键字并稍后注意到它。令我惊讶的是,我没有遇到编译错误,它工作正常,但对于测试用例2,它提供了一个编译器。它们有何不同?测试用例1:structA{constintx=2;A():x(3){}};测试用例2:structA{constintx=2;A(){x=3;//compileerror!error:read-onlyvariableisnotassignable}}; 最佳答案