此代码是否会导致未定义的行为:#includestructS{S(){}intx;};intmain(){std::vectorvec(5,S());}自S()默认初始化一个自动对象,它的内容不会先归零,所以x将是不确定的。然后将包含不确定值的对象复制到每个vector位置。动机:我们可能希望它的行为与std::vectorvec(5);相同这不是UB(C++11起),所以这是一个很容易不小心犯的错误。正如Praetorian在C++11之前的评论中提到的std::vectorvec(5);可以自由地进行5次默认初始化,或者对部分或全部项目使用复制构造函数。
考虑以下两个类: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,
我有这样一个实用类:structAtreturn{std::functionfuncdestr;Atreturn(std::functionfd):funcdestr(fd){}~Atreturn(){funcdestr();}};备注编号explicit构造函数中的属性。可能的用途应该是:直接初始化构造函数调用:Atreturnhook([something](){DestroySomething(something);});复制初始化构造函数调用:Atreturnhook=[something](){DestroySomething(something);};直接列表初始化构造函数
我从CAPI获取一个数组,我想将其复制到std::array以便在我的C++代码中进一步使用。那么这样做的正确方法是什么?我有2个用途,一个是:structFoof;//structfromCapithathasauint8_tkasme[32](andotherthings)c_api_function(&f);std::arraya;memcpy((void*)a.data(),f.kasme,a.size());还有这个classMyClass{std::arraykasme;inttype;public:MyClass(inttype_,uint8_t*kasme_):type
问题在下面的代码中,询问使用所示的值初始化语法是否意味着对各个位域成员进行零初始化或未初始化: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++14标准(N4296)在8.5/17.6.1中说Iftheinitializationisdirect-initialization[...],constructorsareconsidered.Theapplicableconstructorsareenumerated,andthebestoneischosenthroughoverloadresolution.[...]Ifnoconstructorapplies,ortheoverloadresolutionisambiguous,theinitializationisill-formed.因此在直接初始化中,只考虑构造函
以下代码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
在下面的代码中,类S的对象s用于通过直接初始化来初始化类D的对象>Dd(s);。转换函数S::operatorD()用于将对象s转换为D类型的临时对象。然后,gcc和clang都省略了对移动构造函数D(&&)的显式调用,以将此临时对象移动到d中。参见liveexample.#includestructD;structS{operatorD();};structD{D(){}D(D&&){std::cout我基于以下理由质疑这种省略的正确性:这种情况包含在§8.5/16(N3337)的第一个子项目符号点中,其中没有提及省略。Iftheinitializationisdirect-init
例如,代码如下:structA{A(int);};structB{B(A);};intmain(){Bb{{0}};//OKBc({0});//error}错误信息是:f.cc:Infunction'intmain()':f.cc:7:9:error:callofoverloaded'B()'isambiguousBc({0});//error^f.cc:7:9:note:candidatesare:f.cc:2:12:note:B::B(A)structB{B(A);};^f.cc:2:8:note:constexprB::B(constB&)structB{B(A);};^f.cc
这个问题来自this中的评论部分线程,并且在那里也得到了答案。但是,我认为它太重要了,不能只留在评论部分。所以我为此做了这个问答。Placementnew可用于在分配的存储空间中初始化对象,例如,usingvec_t=std::vector;autop=(vec_t*)operatornew(sizeof(vec_t));new(p)vec_t{1,2,3};//initializeavec_tatp根据cppref,PlacementnewIfplacement_paramsareprovided,theyarepassedtotheallocationfunctionasaddit