示例(编译良好)structA{voidf(){};autog()->decltype(f()){}};问题如果我在decltype中添加this指针(即decltype(this->f())),我会在gcc4.7.0中得到以下编译错误:error:invaliduseofincompletetype'structA'error:forwarddeclarationof'structA'error:invaliduseofincompletetype'structA'error:forwarddeclarationof'structA'不允许在decltype中使用this吗?有人可以
T*t;//Tisanimplementationdetailt=newT;//wanttoavoidnamingTtoallowforflexibilityt=newdecltype(*t);//error:cannotuse'new'toallocateareferencet=newstd::remove_reference::type();//clunkyThis回答为什么decltype(*t)返回T&而不是T。我可以将我的最后一行放入宏中,但这似乎不是最理想的。有没有比我到目前为止更好的解决方案?这是否属于CodeReview? 最佳答案
T*t;//Tisanimplementationdetailt=newT;//wanttoavoidnamingTtoallowforflexibilityt=newdecltype(*t);//error:cannotuse'new'toallocateareferencet=newstd::remove_reference::type();//clunkyThis回答为什么decltype(*t)返回T&而不是T。我可以将我的最后一行放入宏中,但这似乎不是最理想的。有没有比我到目前为止更好的解决方案?这是否属于CodeReview? 最佳答案
以下代码:structA{intf(int);autog(intx)->decltype(f(x));};编译失败,报错:error:cannotcallmemberfunction'intB::f(int)'withoutobject如果我将其更改为:structA{intf(int);autog(intx)->decltype(this->f(x));};我收到另一个错误:error:invaliduseof'this'attoplevel其中任何一个有什么问题?我正在使用gcc4.6 最佳答案 这里是神奇的词:structA{
以下代码:structA{intf(int);autog(intx)->decltype(f(x));};编译失败,报错:error:cannotcallmemberfunction'intB::f(int)'withoutobject如果我将其更改为:structA{intf(int);autog(intx)->decltype(this->f(x));};我收到另一个错误:error:invaliduseof'this'attoplevel其中任何一个有什么问题?我正在使用gcc4.6 最佳答案 这里是神奇的词:structA{
这个问题在这里已经有了答案:HowispossibletodeducefunctionargumenttypeinC++?(4个回答)关闭11个月前。是否可以推断出函数参数的类型?例如,如果我有:voidfoo(inta);我想推导出int类型作为foo的第一个参数的类型。可能的用途是:foo(static_cast(value));在thisrelatedquestion,答案是利用同类型成员进行推导,所以不直接推导函数参数类型。 最佳答案 Isitpossibletodeducethetypeofafunctionparamet
这个问题在这里已经有了答案:HowispossibletodeducefunctionargumenttypeinC++?(4个回答)关闭11个月前。是否可以推断出函数参数的类型?例如,如果我有:voidfoo(inta);我想推导出int类型作为foo的第一个参数的类型。可能的用途是:foo(static_cast(value));在thisrelatedquestion,答案是利用同类型成员进行推导,所以不直接推导函数参数类型。 最佳答案 Isitpossibletodeducethetypeofafunctionparamet
如果函数模板返回decltype(auto)(或另一个使用auto的类型说明符)但返回语句格式不正确,SFINAE会导致结果吗?return语句是否被认为是函数签名的直接上下文?N3690草案中似乎没有任何要求。默认情况下,我猜SFINAE不适用。这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但是您不能像以手写方式编写时那样使其存在以委托(delegate)为条件。此外,如果没有decltype(auto),则无法检查对等非静态成员函数的存在,因为this不能在函数签名中使用。然而,这表明存在一个基本问题,因为decltype(auto)提供了一条路径,可以在成员签名中将类类
如果函数模板返回decltype(auto)(或另一个使用auto的类型说明符)但返回语句格式不正确,SFINAE会导致结果吗?return语句是否被认为是函数签名的直接上下文?N3690草案中似乎没有任何要求。默认情况下,我猜SFINAE不适用。这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但是您不能像以手写方式编写时那样使其存在以委托(delegate)为条件。此外,如果没有decltype(auto),则无法检查对等非静态成员函数的存在,因为this不能在函数签名中使用。然而,这表明存在一个基本问题,因为decltype(auto)提供了一条路径,可以在成员签名中将类类
以下代码片段摘自cppref:std::tuplef();auto[x,y]=f();//decltype(x)isint//decltype(y)isint&constauto[z,w]=f();//decltype(z)isconstint//decltype(w)isint&我的问题在最后一行:为什么是decltype(w)int&而不是constint&? 最佳答案 Jarod42回答了评论中的问题,让我在这里引用标准的相关部分,来自[dcl.struct.bind]¹:GiventhetypeTidesignatedbys