jjzjj

decltype

全部标签

c++ - 变量模板参数中的decltype

我正在使用unique_ptr编写一些代码s之类的。该行是:std::unique_ptrresult(...,std::free);哪个有效。我意识到std::free给出的类型是第二个模板参数。我尝试使用:std::unique_ptrresult(...,std::free);这会更容易阅读并且更不容易出错。但是我收到与相关的错误和“用函数类型实例化数据成员”。有没有办法做到这一点? 最佳答案 decltype(std::free)产生std::free的类型,即函数类型void(void*),而不是函数指针类型void(*)

c++ - 使用 SFINAE 检测同类继承

我正在尝试编写一个元函数来检查作为可变参数模板参数传递的所有类型是否不同。执行此操作的最高效方法似乎是从一组类继承并检测是否存在错误。问题是以下代码编译失败,而我希望SFINAE可以工作。编辑。问题不是“如何编写该元函数”,而是“我如何捕获双重继承错误并在它发生时输出false_type”。AFAIK,只有SFINAE才有可能。templatestructdummy{};//error:duplicatebasetype‘dummy’invalidtemplatestructfail:dummy,dummy{};templatetrue_typetest(faila=fail());f

带有箭头符号的 C++ 模板自动返回类型需要 decltype?

C++11为函数中的返回类型引入了箭头符号(不知道名字):templateautofun(T&&a)->decltype(bar(a)){...}但根据scottmeyer的说法,单独使用auto作为返回类型将删除所有const和引用限定符(因为它遵循与模板推导相同的模式),因此惯用的方法是执行decltype(auto)将所有限定符保持在类型之上。但是,在这种情况下,auto是否被推断为decltype(bar(a))?那么decltype(auto)会是decltype(decltype(bar(a)))吗?那会是多余的吗? 最佳答案

c++ - 如何使用decltype判断加法结果

使用decltype我可以执行以下操作:templateautosum(T1const&t1,T2const&T2)->decltype(t1+t2){/*...*/}但是,在我的例子中,我需要在没有T1和T2类型实例的情况下找出加法的类型。具体来说:templateclassMatrix{/*...*/public:templateautooperator+(Matrixconst&other)->Matrix{/*...*/}};当然,decltype(ValueType+CompatibleType)不是这样工作的。有什么办法可以实现这一目标吗? 最佳

c++ - 从成员函数指针获取方法的返回类型

我试图声明一个变量,使其类型与我有一个成员函数指针的成员函数的返回类型相同。classWidget{public:std::chrono::millisecondsFoo();};例如,给定一个成员函数指针fn指向Widget::Foo,我将如何声明一个变量blah这样它就得到了Widget::Foo的返回类型(std::chrono::milliseconds)?我从一篇使用result_of的博客文章中找到了一些有希望的指导。来自连同decltype,但我似乎无法让它工作。autofn=&Widget::Foo;Widgetw;std::result_of::typeblah;这种

c++ - 确定 "generic function"的返回类型

假设,我想开发一个通用库,它应该可用于类似数字的类型,包括double类型和用户定义类型。我现在面临的问题是我不知道如何像这样编写函数模板的返回类型:templateautotransmogrify(Tx)->???{usingstd::abs;returnabs(x)+2.0;}using声明使此函数模板的主体适用于原始类型,因为它们没有关联的命名空间(因此没有ADL)。但我希望transmogrify使用专门的abs函数,以防用户定义类型的作者提供他自己的abs函数。我不能简单地使用->decltype(abs(x)+2.0)因为这对double不起作用,因为std::abs不在范

c++ - decltype(auto) 与 auto&& 执行函数返回类型的通用处理

当使用auto&&处理返回左值的函数时:intfunc(){intv=42;returnv;}auto&&v=func();将v视为引用而不是左值会产生什么后果?这些后果是否证明使用decltype(auto)而不是auto&&来执行函数返回类型的通用处理是合理的? 最佳答案 auto&&已经是捕获函数返回值的最佳选择,因此decltype(auto)的差异只能是缺点。在您的示例中,生命周期延长应用于从函数返回的其他临时对象。这导致它的行为基本上与直接命名的对象相同,其效果是引用限定符被“删除”。将decltype(auto)与按值

使用 decltype 和 constness 的 C++11 尾随返回成员函数

我正在尝试使用decltype理解C++11中基于尾随返回的新函数声明语法。在下面的代码中,我尝试定义一个返回const&的成员函数,以允许对i进行只读访问#include#includestructX{int&i;X(int&ii):i(ii){}//autoacc()const->std::add_const::type{returni;}//failstheconstnesstestautoacc()const->decltype(i){returni;}//failstheconstnesstest//constint&acc()const{returni;}//worksas

c++ - Visual C++ 2015 在使用 decltype(auto) 时给出 C4552 警告

我想我在VisualC++2015中遇到了一个错误,但我想确定一下。考虑这个片段:templatedecltype(auto)f(Tparam){returnparam+1;}intmain(){autoi=f(10);return0;}VisualC++2015在return语句中给出了这个警告:warningC4552:'+':operatorhasnoeffect;expectedoperatorwithside-effect尽管它似乎对生成的代码没有任何影响。这是编译器错误吗? 最佳答案 这似乎是一个错误。它在这里有一个开放

c++ - 具有相同底层类类型的条件运算符

这个程序应该输出0还是1?在我阅读和理解C++14标准中引用的段落时,它应该打印1,但GCC和clang都打印0(因为推导类型是Aconst而不是A常量&):#includestructA{};intmain(){Aa;Aconst&ra=std::move(a);//#1std::cout::value;//Prints0}在这种情况下,ra是一个Aconst左值,而std::move(a)是一个Axvalue,都是类类型。根据有关条件运算符的标准(重点是我的),结果应该是Aconst类型的lvalue,因此decltype结果必须是Aconst&:[expr.cond]/3Othe