草庐IT

initializer-list

全部标签

C++ 初始化列表和可变参数模板

我想创建一个数组:templatestructa{Tx[1+sizeof...(A)];a()=default;a(T&&t,A&&...y):x{t,y...}{}};intmain(){ap{1,1};//oka,a>q{{1,1},{3,3}};//error:badarrayinitializer}为什么不编译?(使用g++4.6测试) 最佳答案 我很确定这是一个错误。{}可以代替()来为构造函数提供参数。因此你的代码应该没问题:intmain(){//thisisfine,callsconstructorwith{1,1}

c++ - constexpr(gcc) 错误 - 错误 : a brace-enclosed initializer is not allowed here before '{' token

structX{constexprstaticchara1[]="hello";//Okayconstexprstaticconstchar*a2[]={"hello"};//Error};intmain(){}用gcc编译报错:error:abrace-enclosedinitializerisnotallowedherebefore'{'token这是对constexpr的非法使用吗?编辑我尝试了3个不同版本的gcc,它是在我拥有的最新4.7.0上编译的(我刚刚下载了它,我使用的是mingw-w64),所以它看起来是一个固定的错误(链接到bug会很好!)。4.7.020120311

C++11 initializer_list 构造函数标记为 "explicit"

我能否将explicit与init-list构造函数一起使用,以确保像{a}这样的表达式不会导致意外的隐式转换?还有一个想法:应该我担心吗?编写{a}比简单地编写a不太可能出错,但另一方面,从代码中我们可能仍然不清楚我们正在构建一个通过隐式转换对象。classFoo{explicitFoo(std::initializer_listilist){/*...*/}}; 最佳答案 你不能。它确实导致意外的隐式转换。但是,意外的隐式转换是不允许的,编译器将拒绝您的程序。然而,这不会阻止编译器选择或考虑它。示例voidf(Foo);void

c++ - 迭代可变模板类型

我已经坚持了一段时间,但我已经没有想法了,感谢帮助!为了简化,以下部分是示例代码。假设如下:classBase;classDerivedA:publicBase;classDerivedB:publicBase;还有这个:classManager{public:std::mapcontainer;templatevoidremove(){//Iteratethroughtemplatessomehowand...container.erase(typeid(T));}}基本上,我通过使用std::type_index作为键,在容器中存储派生类的唯一实例。允许我做类似的事情:manage

c++ - 错误 : jump to label 'foo' crosses initialization of 'bar'

以下C++示例无法使用gcc或clang进行编译,但仅使用ICC生成警告,而使用MSVC则完全不生成任何警告:intmain(intargc,char*argv[]){if(argcg++:init.cpp:13:error:jumptolabel‘clean_up’init.cpp:4:error:fromhereinit.cpp:7:error:crossesinitializationof‘inti’clang++:init.cpp:4:9:error:cannotjumpfromthisgotostatementtoitslabelgotoclean_up;^init.cpp:

c++ - Clang 错误 – 编译器错误或缺少一些细节?

在对可变参数模板、初始化列表等进行一些试验时,我无意中发现了以下无意义的代码,触发了一条相当有趣的错误消息。首先,让我们定义一个小类,用于使用重载的operator,()进行测试:classDummy{public:Dummy(){}Dummy&operator,(int){return*this;}};现在我们按以下方式使用这个类:inttest1=(Dummy{},0);当使用clang版本6.0.0(tags/RELEASE_600/final334239)编译时,这会触发一个非常合法的错误消息(因为运算符(operator)基本上从中删除了0背面):error:noviable

c++ - 使用 boost::assign::list_of 构造 std::vector 时的歧义

这段代码:std::vector(boost::assign::list_of(1)(2)(3));给出错误:main.cpp:Inmemberfunction'void::RequestHandler::processRequest(Foo&,Bar,unsignedint,unsignedint*,constchar*,boost::shared_ptr&)':main.cpp:450:error:callofoverloaded'vector(boost::assign_detail::generic_list&)'isambiguous/4.4.2/bits/stl_vecto

c++ - 一个模板函数,可以接受两个任意类型的列表

我正在试验并尝试制作一个接受两个列表的函数:一个float列表,一个整数列表。我的第一种方法是:templateThing*createThing(FloatIteratorfloatsBegin,FloatIteratorfloatsEnd,IntIteratorintsBegin,IntIteratorintsEnd){...}这适用于各种容器,甚至是普通指针。但是,我不能轻易传入std::initializer_list。例如,我希望能够像这样调用函数:Thing*thing=createThing({3.0,4.0,5.0},{0,1,2,2,3,0});所以我在想,我会尝试这

c++ - initializer_list 返回的生命周期延长

所以我有一个返回类型为auto的lambda我在支持initializer_list的阵列方面遇到问题在这里被摧毁:constautofoo=[](constauto&a,constauto&b,constauto&c){return{a,b,c};};我将像这样使用lambda:autobar=foo(1,2,3);for(constauto&i:bar)cout我正在从事的一项工作将所有lambda表达式作为单一语句作为其编码标准的一部分(请随意表达您的愤怒。)我认为我可以通过以下方式解决这个问题:给予foovectorint的返回类型,但这搞砸了它的通用性:constautofo

c++ - 为什么遍历比合并两个排序的 std::list 更耗时?

令我惊讶的是,遍历比合并两个已排序的std::list花费的时间多12%。由于合并可以被认为和实现为连续的元素比较、列表拼接和迭代器遍历两个分离的排序链表。因此,遍历不应比合并它们慢,尤其是当两个列表足够大时,因为迭代元素的比例正在增加。但是,结果好像和我想的不符,我是这样验证上面的想法的:std::listlist1,list2;for(intcnt=0;cntdiff=std::chrono::system_clock::now()-start;std::cout附言。icc足够聪明,可以消除选项2。尝试sum+=num;并打印出sum。这是perf的输出:(测量的时间在不使用pe