草庐IT

initialization

全部标签

c++ - 为什么编译器不能像在变量声明中那样在结构成员中设置 char[] = { .. } 的大小?

这个问题在这里已经有了答案:Whatisthereasonfornotbeingabletodeducearraysizefrominitializer-stringinmembervariable?(3个答案)关闭5年前。我在结构中使用带有初始化值的struct,如下例所示。我不明白的是为什么编译器不能像在变量声明中那样在结构成员中设置char[]={..}的大小?Clang++给出以下错误:error:arrayboundcannotbededucedfromanin-classinitializer代码:structA{chars[]={'F','O','O',...};};

c++ - 静态变量被初始化两次

假设我在一个编译单元中有一个静态变量,它最终出现在一个static库libA中。然后我有另一个编译单元访问这个变量,它最终在一个shared库libB.so中(所以libA必须链接到libB)。最后我有一个主函数也直接从A访问静态变量and依赖于libB(所以我链接到libAandlibB)。然后我观察到,静态变量被初始化了两次,即它的构造函数运行了两次!这似乎不对。链接器不应该将两个变量识别为相同的变量并将它们作为一个变量进行优化吗?为了让我的困惑更加完美,我看到它使用相同的地址运行了两次!所以也许链接器确实识别了它,但没有删除static_initialization_and_de

c++ - 为什么不首选 std::initializer_list 转换?

考虑这个片段:#include#includevoidf(std::vector){std::coutLiveonColiru如果你运行它,你可以看到f(int)重载是首选,即使std::vector有一个std::initializer_listconstructor(见#8)。问题:为什么首选将{42}转换为int(而不是转换为std::vector,因为{42}是一个std::initializer_list)? 最佳答案 在重载决议中,当考虑implicitconversionsequenceinlist-initializ

c++ - 编译后确定静态初始化顺序?

在C++中,我知道编译器可以选择以它选择的任何顺序初始化静态对象(受一些约束),并且通常您无法选择或确定静态初始化顺序。但是,一旦程序被编译,编译器必须决定以什么顺序初始化这些对象。有什么方法可以从带有调试符号的已编译程序中确定以什么顺序会调用静态构造函数吗?上下文是这样的:我有一个相当大的程序,当它在新工具链下构建时,它在main()之前突然出现段错误。这是一个静态初始化顺序问题,或者它正在加载的库之一有问题。但是,当我使用gdb进行调试时,崩溃位置只是报告为原始地址,没有任何符号信息或回溯。我想通过在第一个静态初始化对象的构造函数处放置一个断点来确定这两个问题中的哪一个,但我不知道

c++ - 对于构造函数,我如何在可变参数模板与 std::initializer_list 之间进行选择?

在c++11的当前状态下(比如gcc4.7.2),我应该如何选择使用variadic-template或std::initializer_list我什么时候需要一个可以接受可变参数的构造函数? 最佳答案 可变参数模板允许您提供不同类型的参数,而std::initializer_list是用参数类型模板化的。这意味着列表中所有元素的类型必须相同(或可转换为基础类型,但不允许缩小转换)。根据这是否适合您,您可以选择其中之一。此外,如果您需要完美转发,可变参数模板通常是默认选择,因为语法形式T&&可以绑定(bind)到左值引用和右值引用,

c++ - C++11 中的数组声明和初始化

这里有8种在C++11中声明和初始化数组的方法,在g++下看起来没问题:/*0*/std::arrayarr0({1,2,3});/*1*/std::arrayarr1({{1,2,3}});/*2*/std::arrayarr2{1,2,3};/*3*/std::arrayarr3{{1,2,3}};/*4*/std::arrayarr4={1,2,3};/*5*/std::arrayarr5={{1,2,3}};/*6*/std::arrayarr6=std::array({1,2,3});/*7*/std::arrayarr7=std::array({{1,2,3}});根据严格

c++ - const 字段的复杂初始化

考虑这样一个类:classMyReferenceClass{public:MyReferenceClass();constdoubleImportantConstant1;constdoubleImportantConstant2;constdoubleImportantConstant3;private:voidComputeImportantConstants(double*out_const1,double*out_const2,double*out_const3);}有一个例程(ComputeImportantConstants)在运行时计算三个常量。假设计算相当复杂,并且固有

c++ - 为什么 std::unique_ptr 重置与赋值不同?

我想知道为什么std::unique_ptrp=newMyClass;没有效果,但是std::unique_ptrp;p.reset(newMyClass);很好。我有点理解它们的不同之处,但我想知道为什么选择让它们不同。assignment和reset不一样有什么危险? 最佳答案 首先,std::unique_ptrp=newMyClass;不是赋值,是copyinitialization.它不起作用,因为constructorofstd::unique采用原始指针标记为explicit:explicitunique_ptr(po

c++ - C++ 中未初始化的变量行为

我自己查了一下,我写了一个这样的程序intmain(){inti;cout我运行了程序几次,结果一直都是一样的,都是零。我在C中试过,结果是一样的。但是我的教科书上说Ifyoudon’tinitializeanvariablethat’sdefinedinsideafunction,thevariablevalueremainundefined.Thatmeanstheelementtakesonwhatevervaluepreviouslyresidedatthatlocationinmemory.当程序总是为变量分配空闲内存位置时,这怎么可能?它怎么可能不是零(我假设默认可用内存值

C++ 实例初始化语法

这个问题在这里已经有了答案:Isthereadifferencebetweencopyinitializationanddirectinitialization?(9个回答)关闭4年前。给定这样一个类:classFoo{public:Foo(int);Foo(constFoo&);Foo&operator=(int);private://...};这两条线是完全等价的,还是它们之间有细微的差别?Foof(42);Foof=42;编辑:我通过在原始问题中使Foo构造函数“显式”来混淆问题。我已将其删除,但感谢您的回答。我还添加了复制构造函数的声明,以明确复制可能不是一个微不足道的操作。我