草庐IT

Initialization

全部标签

c++ - 非静态常量数据成员

如何在C++中定义类的非静态常量数据成员?如果我尝试编译以下代码:classa{public:voidprint(){cout我得到一个错误ISOC++forbidsinitializationofmember‘y’ 最佳答案 在C++03中,您可以在构造函数中使用成员初始化列表来初始化类的const字段。例如:classa{public:a();voidprint(){cout注意构造函数之后的语法:y(2)。这告诉C++将字段y初始化为值2。更一般地说,您可以使用此语法将类的任意成员初始化为您希望它们具有的任何值。如果您的类包含

c++ - 为什么对象的初始化会调用复制构造函数?

考虑以下最小工作示例:#includeintmain(){::std::atomica=false;}atomic的Copyctor和copyassignment都被显式删除。但是,这应该调用ctortakingexactlyabool.g++和clang++都提示这一行试图调用atomic的复制构造函数:$g++-std=c++1za.cppa.cpp:Infunction‘intmain()’:a.cpp:4:27:error:useofdeletedfunction‘std::atomic::atomic(conststd::atomic&)’::std::atomica=fal

c++ - 初始化模板化、递归、POD 结构

我正在尝试使用模板递归来生成嵌套的POD结构,我遇到了一些我没有预料到的行为。这是一个简化的测试用例:#includetemplatestructRecursiveStruct{public:templatestructBuilder{staticconstBuildervalue;staticconstsize_tmid=start+length/2;staticconstsize_tend=start+length;Builderleft;Builderright;};templatestructBuilder{staticconstBuildervalue;intdata;};s

c++ - 在复制初始化中,对复制构造函数的调用是显式的还是隐式的?

classAAA{public:explicitAAA(constAAA&){}AAA(int){}};intmain(){AAAa=1;return0;}在上面的代码中,据我了解,虽然在大多数情况下被省略,但在语义上仍然需要调用复制构造函数。我的问题是,调用是显式的还是隐式的?很长一段时间以来,我的脑海里都得出这样的结论:对AAA::AAA(int)的调用是隐式的,但对复制构造函数的调用不是。今天不小心弄到g++编译上面的代码,报错了。(VC12编译OK。)在标准的第8.5节中:Ifthedestinationtypeisa(possiblycv-qualified)classtyp

c++ - 逗号作为变量初始化中的分隔符(不是作为运算符)

这似乎是一个简单的问题,但我已经很久没有以自己的方式检查过这个问题了……当初始化用逗号分隔的变量时,我假设以下是不安全的做法:unsignedintn=foo.size,nxn=n*n;因为我从来没有真正使用逗号运算符来表示句法糖等;而是表明两个表达式是独立的——作为一种对“细粒度并行性”(或表达式独立性)的隐式注释,这通常会使代码更简洁,例如,if()a=true,b=value;而不是为分号分隔的表达式要求{}范围。但我的问题实际上是重新检查变量初始化的情况。我的假设是否不正确nxn不能依赖于按预期进行初始化?还是我一直都在误解中苦苦挣扎? 最佳答案

c++ - 为什么这里涉及移动构造函数

我有这段C++代码:classArgs{};classMyClass{public:MyClass(Args&a){}MyClass(MyClass&&)=delete;};intmain(){Argsa;MyClassc1=MyClass(a);MyClassc2=a;MyClassc3(a);return0;}这不会编译,因为对象c1和c2的构造似乎涉及类的移动构造函数:错误:使用已删除的函数“MyClass::MyClass(MyClass&&)”似乎编译器想要创建临时对象,然后将它们移动到c1和c2。为什么会这样?这三个语句不应该只调用MyClass(Args&a)构造函数吗?

c++ - 评估潜在常量表达式期间的未定义行为

考虑这个程序:#include#include#includeexterninti;structS{S(){if(i==0){puts("Hello,world!");exit(0);}}};Ss;inti=1+2*INT_MIN;intmain(){}根据我对表达式求值的理解,这是一个严格符合标准的程序,它打印“Hello,world!”,然后退出,并且从不实际求值i的初始化程序:3.6.2Initializationofnon-localvariables[basic.start.init][...]Variableswithstaticstorageduration(3.7.1)

c++ - 绑定(bind)引用实际上是否评估操作数?

考虑这段代码:int&x=*newint;赋值的RHS是否实际上取消引用新创建的指针,导致UB由于读取未初始化的变量?或者这是否可以合法地用于以后分配一个值,如x=5;? 最佳答案 据我所知,您所做的一切都不涉及未定义的行为。但是,它确实会立即产生内存泄漏的风险。它可以快速解析(因为&x会解析到泄漏内存的地址,因此可以被删除)但是如果你要离开范围,你将无法检索该指针。编辑:切中要点,如果你要写的话int&x=*newint;x=5;std::cout>x;std::cout代码的行为就像您只是将x声明为intx;一样,除了指针在程序

c++ - C++ 全局初始化可以有多惰性?

我习惯于认为全局变量/静态类成员的所有初始化都发生在main()的第一行之前。但我最近在某处读到该标准允许稍后进行初始化以“协助动态加载模块”。当动态链接时我可以看到这是真的:我不希望在我dlopen'ed库之前初始化库中的全局初始化。但是,在一组静态链接在一起的翻译单元(我的应用程序的直接.o文件)中,我会发现这种行为非常不直观。这只会在动态链接时延迟发生,还是可以随时发生?(或者我读错了什么?;) 最佳答案 该标准在3.6.2/3中有以下内容:Itisimplementation-definedwhetherornotthedy

c++ - 使用整数文字初始化 char 数组和 char 的区别

在我的系统上(4.13.11-1-ARCH,gcc7.2.0)char是signed。当使用integerliteral初始化char数组时,如下所示:constcharmydata[]={0x80};我收到以下错误:error:narrowingconversionof‘128’from‘int’to‘char’inside{}[-Wnarrowing]然而,当我改为执行constchardata=0x80时,编译器并不担心任何缩小,尽管它当然会发生。输出为7F,即最大正signedchar值。问题为什么编译器不会同样担心两种情况下的截断问题? 最佳答案