考虑:intconvert_it(std::string&x){return5;}voidtakes_int_ref(int&i){}我想编写一个函数,它仅在可以应用convert_it并将结果传递给takes_int_ref时才存在。即函数体为:templatevoiddoit(A&a){inti=convert_it(a);takes_int_ref(i);}但是,如果我这样做:templateautodoit(A&a)->decltype(takes_int_ref(convert_it(a)),void())它不起作用,因为从“int”类型的右值初始化“int&”类型的非常量引
我在研究lambda表达式时遇到了这个问题:#includeusingstd::cout;intmain(){autolam=[](inta){cout但是编译器如上评论的那样提示。据我所知,lambda是一个未命名类的对象。所以我想这个片段可以工作。我在哪里犯了错误,我可以改进吗?Alambda有什么样的构造函数?有没有像decltype(lambda)object(args...)这样的非默认构造函数? 最佳答案 lambda作为类实现的事实并不是程序员真正关心的任何问题。你不应该知道/关心/考虑那个。推而广之,它是否有默认构造
析构函数是一种特殊的成员函数,它不接受任何参数,也没有返回类型:几乎所有的C++书籍中都提到了这一点。但是,在libstd++库中,它使用以下内容来测试类型是否可破坏,struct__do_is_destructible_impl{template().~_Tp())>statictrue_type__test(int);templatestaticfalse_type__test(...);};Gnug++会显示带有typeidvoid的_U,那么,析构函数会返回一个类型吗?请专家解释一下c++标准对此有何规定。 最佳答案 请注意
如果我们有以下内容:templatestructB{Tdata;}structA{intdata_array[100];}intmain(){Ax;constAx_const;autoy1=f(A());autoy2=f(x);autoy3=f(x_const);autoy4=f(std::move(x));}我想知道一个f(最好是函数,但宏也可以)这样:decltype(y1)==Bdecltype(y2)==Bdecltype(y3)==Bdecltype(y4)==B也就是说,f完美地将x转发到B的对象中。 最佳答案 这是不可
假设我有这样一个函数:staticconstboost::int32_tSOME_CONST_VALUE=1073741823;templatetargetTypeConvert(sourceTypesource){typedefdecltype(source*SOME_CONST_VALUE)MulType_t;//typedefboost::int64_tMulType_t;MulType_tval=(MulType_t)source*(MulType_t)SOME_CONST_VALUE;returnval/(MulType_t)SOME_CONST_VALUE;}当我这样调用这
templatedecltype(*(T*)(0)**(U*)(0))mul(Tx,Uy){returnx*y;}这段代码取自Stroustrup的C++11FAQ.我明白它的作用,就是将两个不同类型的对象相乘。令我困惑的是模板参数和函数定义之间的语法。decltype内部发生了什么?我认为它正在取消引用初始化为0的未命名T指针,并将其乘以以相同方式取消引用和初始化的未命名U指针。我说得对吗?好吧,如果这是正在发生的事情,那么指针、解引用和额外的括号的使用不是多余的吗?我不能在保持预期效果的同时初始化这样的类型吗?:templatedecltype(T(0)*U(0))mul(Tx,U
有没有办法比较C++11中decltype的结果?换句话说,为什么这段代码无效:templatevoidfunc(T&t,U&u){if(decltype(t)==decltype(u)){//Someoptimisedversionforthiscase}else{//Amoregeneralcasefordifferingtypes}}我知道在某些情况下,这个特殊问题可以通过部分模板特化来解决;我的问题是关于decltype的比较。编辑:在尝试通过SFINAE为免费函数提供默认值的过程中出现了这个问题。也许更好的问题是为什么这是无效的:templateboolSomeFunctio
我有以下代码:#includeintmain(){int*a=newint(2);std::unique_ptrp(a);}导致这些错误信息:Infileincludedfroma.cpp:1:Infileincludedfrom/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/memory:81:/usr/bin/../lib64/gcc/x86_64-unknown-linux-gnu/4.9.2/../../../../include/c++/4.9.2/bits/
我正在学习C++11中的decltype。auto和decltype的功能似乎是重复的,我不明白为什么我们需要decltype。根据wiki,它的主要用途是在泛型编程中,在这种编程中通常很难甚至不可能表达依赖于模板参数的类型。在泛型编程中,当难以表达类型时,我可以使用auto:templatevoidMakeAnObject(constT&builder){autoval=builder.MakeObject();//dostuffwithval}我不明白为什么需要decltype。decltype可以做一些auto做不到的事情吗? 最佳答案
我有一个某种类型的对象,例如std::vectorv;现在,比方说,我想验证v释放其所有内部内存。在C++11之前shrink_to_fit()方法,推荐/保证的方法是swap()空的std::vector同类型的。但是,我不想指定对象的类型。我可以使用decltype指定类型,所以我想写这样的东西:std::vectorv;//usev....v.swap(decltype(v)());//Createatemporaryofsametypeasvandswapwithit.^^但是,上面的代码不起作用。我似乎无法创建decltype(v)类型的临时文件带有一个空的ctor(在本例中