草庐IT

Initializer-list

全部标签

c++ - 在 C++11 中,如何在 vector 上调用 std::max?

我有一个vector(其中data是我自己的宠物类型)我想找到它的最大值。标准std::maxC++11中的函数似乎在对象集合上工作,但它需要一个初始化列表作为它的第一个参数,而不是像vector这样的集合。:vectorvd;std::max(vd);//Compilationerrorstd::max({vd[0],vd[1],vd[2]});//Works,butnotoksinceIdon'tvd.size()atcompiletime我该如何解决这个问题? 最佳答案 std::max重载仅适用于编译时已知的小集合。你需要的

c++ - 为什么要为 std::forward_list 拼接整个列表或线性范围?

将范围从一个列表拼接到另一个列表可以在常数时间内完成,但代价是使size()的复杂度呈线性。C++11改变了std::list的情况,要求size()为常数时间。例如,这破坏了gcc的实现,参见[C++0x]std::list::sizecomplexity.除了splice()范围外,还有什么其他原因size()不能成为常量时间在早期,C++03符合std::listimplementations?为什么拼接整个列表或范围是线性的std::forward_list?参见splice_after(),案例(1)和(3)。另见standarddraftN3485中的23.3.4.6for

c++ - 将 braced-init-list 分配给数组是否正确?

关闭。这个问题不符合StackOverflowguidelines。它目前不接受答案。这个问题似乎与helpcenter中定义的范围内的编程无关。关闭9年前。Improvethisquestion标准说,5.17/9下Abraced-init-listmayappearontheright-handsideof-anassignmenttoascalar[...]-anassignmentdefinedbyauser-definedassignmentoperator[..]在GCC4.5.1-pre9999中,我可以编译它(使用-std=c++0x,而不是-std=gnu++0x)#

c++ - 为什么这个 initializer_list 在传递字符串时使用了错误行为?

我已经尝试了我的G++版本的C++0x初始化列表实现,但它只输出空行。#include#include#includeintmain(){std::initializer_lista({"hello","stackoverflow"});for(autoit=a.begin(),ite=a.end();it!=ite;++it)std::cout我不知道我做错了什么。谁能帮帮我吗? 最佳答案 在上面的示例中,您似乎正在创建两个初始化列表。临时{"hello","stackoverflow"}和std::initializer_lis

c++ - 不同类的构造函数重载解析

考虑这段代码。structA{inti;};structB{charc;};structC{doubled;};voidf(Aa);voidf(Bb);voidf(Cc);voidg(){f({5});}这里我在f({5});中遇到了歧义。但是好像structA的构造函数是完全匹配{5}的,而第二个需要整数提升,而最后一个需要float转换。那么为什么会出现歧义呢? 最佳答案 即使序列中的第一个转换排名较差,两个转换序列最终都是用户定义的转换,因为它们都转换为用户定义的类型。[over.ics.user]1Auser-defined

c++ - 返回并自动推导 std::initializer_list

在以下内容中:autox={0};//autodeductionofstd::initializer_listautoy=[]()->std::initializer_list{return{0};}();//explicitautoz=[](){return{0};}();//won'tcompile为什么不能返回并自动推断std::initializer_list的类型? 最佳答案 好吧,因为标准是这么说的,而且因为braced-init-list不是表达式。根据C++11标准的第5.1.2/4段:[...]Ifalambda-

c++ - 为什么 C++ 允许将 std::initializer_list 强制转换为基本类型,并用于初始化它们?

这个问题是关于std::initializer_list,以及为什么它被允许初始化原始类型。考虑以下两个函数:voidfoo(std::stringarg1,boolarg2=false);voidfoo(std::stringarg1,std::dequearg2,boolarg3=false);为什么会这样,当这样调用foo时:foo("somestring",{});选择了第一个重载,而不是第二个?好吧,实际上不是为什么它被选中,而是因为{}可用于初始化任何,包括原始类型。我的问题是这背后的原因。std::initializer_list采用{args...},因此在编译时不能有

c++ - 推导容器和 initializer_list-s 的模板函数

我想编写一个辅助函数,例如:templateautohelper(constRange1&left,constRange2&right,F&&pred){usingnamespacestd;//forcbegin/cendandADLreturnpred(cbegin(left),cend(left),cbegin(right),cend(right));}它适用于容器:std::vectorv1={1,2,3,4,5,6};std::vectorv2={5,4,3,2,1,6};std::cout但它无法推断出initializer_list-s(example):std::cout

c++ - std::forward_list 成员可以实现为静态的吗?

std::forward_list提供了insert_after和erase_after成员,它们可能不需要实际访问std::forward_list对象。因此,它们可以作为static成员函数实现,并且可以在没有列表对象的情况下被调用——对于想要从列表中删除自身的对象很有用,这是一种非常常见的用法。编辑:此优化仅适用于std::allocator或用户定义的无状态分配器的forward_list特化。符合标准的实现可以做到这一点吗?§17.6.5.5/3说AcalltoamemberfunctionsignaturedescribedintheC++standardlibrarybe

c++ - `constexpr` 变量 "used in its own initializer": Clang vs. GCC

这个问题似乎与anexistingone有关,但我不明白theanswerthere中提供的“可移植解决方法”(涉及constautothis_=this;)而且我认为下面的例子更容易理解。我正在使用以下C++17代码片段(livedemo):#includestructTest{constchar*name_{nullptr};constTest*src_{nullptr};constexprTest(constchar*name)noexcept:name_{name}{}constexprTest(constTest&src)noexcept:src_{&src}{name_=s