草庐IT

初始化OpenStack

全部标签

c++ - Pre C++20 位字段零初始化

问题在下面的代码中,询问使用所示的值初始化语法是否意味着对各个位域成员进行零初始化或未初始化:structS{//SisPODinta:3;intb:1;};Ss1;Ss2{};s1.a;//uninitialized(ok,weunderstandthis)s1.b;//"s2.a;//zeroorjunk?s2.b;//"这是对位域的回顾:https://en.cppreference.com/w/cpp/language/bit_field为具有许多位字段的结构创建归零构造函数通常是在遗留代码中使用丑陋的memset完成的,因为在构造函数初始化列表中使用value-init语法重

c++ - 从它之后声明的另一个成员数据初始化一个成员数据是未定义的行为吗?

如果我的类声明了两个成员数据x_和y_以便从y_初始化x_>和y_有一个值那么x_有一个Undefinedvalue吗?或者是什么?classEmpl{public:intx_{y_};inty_{10};};intmain(){Emple{};std::cout我在MSVC++2105上尝试了该示例并得到:0和10而在GCC上我得到了10和10!那么这样做是不是未定义的行为? 最佳答案 Soasaresultisitundefinedbehaviortodoso?是的。读取不确定值的行为是未定义的。在本例中,y_的值用于初始化x_

c++ - 直接初始化中的转换运算符

C++14标准(N4296)在8.5/17.6.1中说Iftheinitializationisdirect-initialization[...],constructorsareconsidered.Theapplicableconstructorsareenumerated,andthebestoneischosenthroughoverloadresolution.[...]Ifnoconstructorapplies,ortheoverloadresolutionisambiguous,theinitializationisill-formed.因此在直接初始化中,只考虑构造函

c++ - MS VC++ 上直接和复制初始化的不同行为(使用用户定义的转换运算符)

以下代码compilesfine同时使用g++9.1和clang8.0.0(编译标志为-std=c++17-Wall-Wextra-Werror-pedantic-errors),但不适用于MSVC19.22(编译标志为/std:c++17/permissive-):structX{};structBar{Bar()=default;Bar(X){}};structFoo{operatorX()const{returnX{};}operatorBar()const{returnBar{};}};intmain(){Foofoo;[[maybe_unused]]Barb1=foo;//O

C++0x 嵌套初始化列表

我想使用C++0x新的初始化列表功能来初始化一个std::vector,它具有编译时定义的项数,用于我当前正在处理的新API。像这样:templatestd::initializer_listduplicate(std::strings){//returnsduplicatedntimesreturn{s,s,s};}std::vectorv={"foo",duplicate("bar")};你知道如何完成这个吗?有可能吗?我知道我需要使用TMP和递归来构建重复字符串列表,并最终通过常量(例如枚举)以某种方式访问​​它。但似乎我什至不能像这样嵌套初始化列表。

c++ - 内置类型的对象是否具有特殊的静态初始化顺序优先级?

我预计以下代码会产生段错误(或其他UB):structT{T();};Tt;charconst*str="Teststring";T::T(){std::cout那是因为t是在str之前初始化的。由于零初始化,我希望str保持值(charconst*)0。我对[C++11:3.6.2/2]的解释支持这一点。然而,theabovesnippetappearstooutputthestringasexpected(我还通过打印指针的值来确认该行为)。是否有一些我在这里遗漏的静态初始化规则,允许str在t开始构建之前进行值初始化?它在标准中的什么位置?这是在staticvariableres

c++ - 是否可以通过列表初始化调用用户定义的转换函数?

这个程序合法吗?structX{X(constX&);};structY{operatorX()const;};intmain(){X{Y{}};//??error}在n2672之后,并经defect978修订,13.3.3.1[over.best.ics]具有:4-However,whenconsideringtheargumentofaconstructororuser-definedconversionfunctionthatisacandidate[...]by13.3.1.7[...]whentheinitializerlisthasexactlyoneelementanda

C++ 默认构造函数,用新对象初始化指针

我有以下问题:在myClass中,我想默认初始化一个指向yourClass的指针,并使用新的yourClass地址。不幸的是,如果我想在任何时候删除指针,我都会得到一个(核心转储)。classmyClass{protected:yourClass*yc;public:myClass(){yc=newyourClass();}myClass(yourClass*tyc){deleteyc;yc=tyc;}~myClass(){deleteyc;yc=NULL;}voidsetMyClass(yourClass*tyc){deleteyc;yc=tyc;}voidprint(){yc->p

C++ std::vector<bool> 使用 drmemory 给出未初始化的读取错误

我在我的项目中使用了STL容器,我发现了一个我无法解释的奇怪错误。让我们考虑以下代码:#include#includeintmain(intargc,char**argv){std::vectorvec;vec.resize(5,false);std::cout这按预期输出0,但如果我使用drmemory运行内存检查,它会发现未初始化的读取。有人可以帮助理解这种行为吗?平台:win32;编译器:mingw32-gcc4.7.2;Drmemory1.6.0-构建2 最佳答案 std::vector是一个奇怪的小东西,使用位来实现它的目

c++ - 新字符数组不会初始化为全零

我正在尝试为可变长度的字符串分配内存n。这是我的尝试:intn=4;//Realistically,thisnumbervaries.char*buffer=newchar[n*512]();printf("buffer[0:3]=[%d][%d][%d][%d]\n",buffer[0],buffer[1],buffer[2],buffer[3]);我的理解是,在末尾包含()应该将所有元素初始化为零。但是,我注意到了其他情况。这是控制台的输出:buffer[0:3]=[-120][-85][-45][0]如何使new初始化程序正常工作?注意:我知道我可以使用std::fill,但我很