草庐IT

member_list

全部标签

c++ - 成员(member)检测代码说明

这不是整个概念,而是它用来确定类是否具有n数据成员的方法之一。这是完整的代码;SFINAE用于成员检测的普通用法。templatestructhas_X{structFallback{intX;};structDerived:T,Fallback{};templatestructS;templatestaticchar(&f(S*))[1];templatestaticchar(&f(...))[2];public:conststaticboolvalue=sizeof(f(0))==2;};Derived继承自Fallback和T的部分让我感到困惑,因为当我们重载f,&C::X是&D

c++ - 类方法声明中的 decltype : error when used before "referenced" member is declared

考虑followingcode:structtest{autofunc()->decltype(data){}//ERRORintdata;};intmain(){testt;t.func();}它给出了以下错误:main.cpp:2:29:error:'data'wasnotdeclaredinthisscopeautofunc()->decltype(data){}但是,如果我将data放在func()之上,它不会给出任何错误(livecode):structtest{intdata;autofunc()->decltype(data){}};...所以我的问题是,为什么declt

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++ - C++ 中的类布局 : Why are members sometimes ordered?

C++标准规定,单个访问部分内的成员变量必须按照它们声明时的相同顺序在内存中布局。同时,编译器可以自由选择访问部分的相互顺序。这种自由使得理论上不可能链接由不同编译器创建的二进制文件。那么,严格的段内排序的其余原因是什么?即将推出的C++09新的C++11标准是否提供了一种完全“手动”确定对象布局的方法? 最佳答案 Thisfreedommakesitimpossibleintheorytolinkbinariescreatedbydifferentcompilers.由于多种原因这是不可能的,结构布局是最次要的。vtables,o

c++ - 是否可以为每个循环删除 c++11 中 std::list 的元素

我想对每个循环使用新的C++11来迭代列表的所有元素并删除某些元素。例如std::listmyList;myList.push_back(1);myList.push_back(13);myList.push_back(9);myList.push_back(4);for(intelement:myList){if(element>5){//Dosomethingwiththeelement//erasetheelement}else{//Dosomethingelsewiththeelement}}是否可以使用foreach循环来完成此操作,还是我必须返回迭代器才能实现此目的?

c++ - 如何访问 std::list 的第一个元素?

我有一个列表std::list*l;.此列表不为空且具有一些值。我的问题是如何正确访问项目?我不需要遍历列表。我只想要第一个项目。std::list::iteratorit=l->begin();if(it!=l->end()){//accessingTintvalue=(*it)->value();//Isthissafe?}或者我还应该检查null吗?if(it!=l->end()&&(*it)){//accessingTintvalue=(*it)->value();} 最佳答案 如果你被迫使用std::listmyList;

c++ - 什么语言规则允许 C++11 推断这是一个 initializer_list 对?

在C++11中,初始化std::map似乎是合法的如下:std::mapmyMap={{"One",1},{"Two",2},{"Three",3}};直觉上,这是有道理的——大括号括起来的初始化器是一个字符串对列表,std::map::value_type是std::pair(可能具有一些const资格。但是,我不确定我是否理解此处的输入方式。如果我们在这里去掉变量声明,只用大括号括起来的初始化器,编译器就不会知道它正在查看std::initializer_list>。因为它不知道括号对代表std::pair秒。因此,编译器似乎以某种方式推迟了将类型分配给大括号括起来的初始化程序的行