草庐IT

initialization

全部标签

C++:const-从一个初始化函数初始化多个数据成员

我有一个带有两个数据成员的C++类,例如,classmytest(){public:mytest():a_(initA()),b_(initB()){};virtual~mytest(){};private:doubleinitA(){//somecomplexcomputation}doubleinitB(){//someothercomplexcomputation}private:constdoublea_;constdoubleb_;}不幸的是,initA和initB不能如上图所示分开。a_和b_都可以通过一次复杂的大计算来初始化,其中b_的值取决于计算的中间结果>a_,例如,

c++ - pre-main 全局初始化程序是否保证运行单线程?

例如,以下代码段中的node::node()构造函数访问全局变量node::count和::tail没有任何多线程保护。C++标准是否保证输出始终是012的排列(无论顺序如何)?#includestructnode*tail;structnode{staticintcount;intindex;node*prev;node(){index=count++;prev=tail;tail=this;}};intnode::count;nodeone,two[2];intmain(intargc,char*argv[]){for(node*p=tail;p;p=p->prev)printf(

c++ - 从括号内的 initializer_list 构造时调用了错误的重载

我一直认为当我使用初始化列表C++语法时:something({...});编译器总是很清楚我想调用采用std::initializer_list的重载,但对于MSVC2015似乎不太清楚。我测试了这个简单的代码:#include#includenamespacetesting{templatestructTest{Test(){printf("Test::Test()\n");}explicitTest(size_tcount){printf("Test::Test(int)\n");}Test(std::initializer_listinit){printf("Test::Tes

c++ - 初始化模板类的静态成员

我想弄清楚为什么这个例子不能编译。我的理解是,如果未显式设置静态变量,则它默认为0。在下面的五个示例中,其中四个的行为符合我的预期,但被注释掉的那个将无法编译。#includeclassFoo{public:staticinti;staticintj;};templateclassBar{public:Bar(int){}staticinti;};staticinti;intFoo::i;intFoo::j=1;templateintBar::i;templateintBar::i=3;intmain(intargc,char**argv){std::cout::i"::i::i"::

c++ - 用户定义类型的数组成员初始化

g++4.7支持数组成员初始化,我开始玩了。下面的代码无法编译。structA{A(int){};A(constA&)=delete;A&operator=(constA&)=delete;~A(){};};structB{B():a{{0},{1}}{};Aa[2];};Bb;gcc4.8(预发布版)的错误信息是:n.cc:Inconstructor‘B::B()’:n.cc:12:20:error:useofdeletedfunction‘A::A(constA&)’a{{0},{1}}^n.cc:4:8:error:declaredhereA(constA&)=delete;^有

c++ - POD的零初始化

structLine{Boundsbounds_;Vectororigin_;uint32_tbegin_;uint32_tend_;distascent_;distdescent_;};使用方法如下:Lineline={};while(!parser.done()){line=Line();//zero-initialize...}Bounds和Vector是非POD类,dist是int64_t的类型定义。但是,优化的32位VC++11发布版本似乎在while循环中至少留下了line的部分未初始化。为什么?根据Dotheparenthesesafterthetypenamemakea

c++ - 如何初始化const循环引用成员

比如我有两个类classFoo;classBar;classFoo{constBar&m_bar;...};classBar{constFoo&m_foo;...};让foo是Foo的对象和bar是Bar的对象.有什么方法(正常或“黑客”)来创建/初始化foo和bar他们的成员m_bar和m_foo会互相引用(我的意思是foo.m_bar是bar而bar.m_foo是'foo')?允许添加任何成员到Foo和Bar,为他们添加parent,使他们成为模板等等。 最佳答案 foo和bar的联系是什么?如果他们有外部链接,你可以这样写:e

模板类型的 C++ Constexpr 成员

我想创建一个模板类,其成员是一个constexpr数组。当然,数组需要根据它的类型进行不同的初始化,但我不能在不初始化数组的情况下声明它。问题是在模板专门化之前我不知道数组的值。//A.hpptemplateclassA{public:staticconstexprTa[];constexprA(){};~A(){};}//B.hppclassB:publicA{public:constexprB();~B();};//B.cpptemplateconstexprintA::a[]={1,2,3,4,5};B::B(){}B::~B(){}如何正确初始化B中的A::a[]?

c++ - 包含未初始化值的对象 vector

此代码是否会导致未定义的行为:#includestructS{S(){}intx;};intmain(){std::vectorvec(5,S());}自S()默认初始化一个自动对象,它的内容不会先归零,所以x将是不确定的。然后将包含不确定值的对象复制到每个vector位置。动机:我们可能希望它的行为与std::vectorvec(5);相同这不是UB(C++11起),所以这是一个很容易不小心犯的错误。正如Praetorian在C++11之前的评论中提到的std::vectorvec(5);可以自由地进行5次默认初始化,或者对部分或全部项目使用复制构造函数。

c++ - 为什么这种直接初始化有效? (C++ 17)

考虑以下两个类:classB{public:B(){}B(constB&b)=delete;//Movectornotimplicitlydeclared};classA{public:A(){}operatorB(){returnB();}};我明白为什么这段代码编译得很好:Aa;Bb=a;遵循copy-initialization的规则,对象“a”被转换为B类型的纯右值,因为在C++17中不再需要复制构造函数,所以没有错误:IfTisaclasstype,andthecv-unqualifiedversionofthetypeofotherisnotTorderivedfromT,