草庐IT

decltype

全部标签

C++ 11新特性之auto和decltype

概述        在C++11标准中,引入了两大关键类型推导机制,即:auto关键字和decltype表达式。这两个特性不仅极大地简化了代码编写,提升了可读性,还为开发者提供了更加灵活、直观的类型声明方式。本文将详细解读auto和decltype的概念、工作原理及其在实际编程中的应用。auto的使用        auto在C++03中表示临时变量的语义,由于使用极少且多余,在C++11中已被删除。在C++11之前,变量的类型必须在声明时显式指定。然而,随着模板元编程和复杂类型表达式的广泛使用,手动书写完整的类型显得既冗余又容易出错。C++11引入的auto关键字解决了这个问题,并具有两种用

c++ - 如何将引用类型转换为值类型?

我正在尝试使用新的decltype关键字将一些代码移动到模板,但是当与取消引用的指针一起使用时,它会生成引用类型。中南合作:#includeintmain(){inta=42;int*p=&a;std::cout::max()::max()第一个numeric_limits有效,但第二个抛出value-initializationofreferencetype'int&'编译错误。如何从指向该类型的指针获取值类型? 最佳答案 您可以使用std::remove_reference使其成为非引用类型:std::numeric_limit

C++11/14 和 return( ... ) 与 return

在C++中,您可以编写如下所示的return语句:return(...);这与更流行的不同:return...;特别是第一个版本返回包含该return语句的函数堆栈的局部地址/引用。现在为什么有些东西想要返回对当时没有生命周期的东西的引用?这个成语的用例是什么?考虑到C++11和C++14的新流行语和特性,这有不同的用法吗? 最佳答案 形式为returnexpression;表达式可以是任何东西,包括带括号的表达式。这些不是不同的形式返回,但是,一起使用decltype(auto)将推导出不同的类型。

c++ - 当其返回类型为 void 时,使用其他 lambda 结果调用 lambda

以下函数生成一个lambda,它使用第一个可调用对象的结果调用第二个可调用对象。如果第一个可调用对象返回一个元组,它将应用于第二个可调用对象。templatestructis_tuple:std::false_type{};templatestructis_tuple>:std::true_type{};templateconstexprdecltype(auto)pipeline(S&&source,T&&target){return[callables=std::tuple(std::forward(source),std::forward(target))](auto&&...a

c++ - decltype((void)T{}) in template Partial Specialization 不推导?

templatestructTest{staticconstintvalue=0;};templatestructTest{staticconstintvalue=2;};templatestructTest{staticconstintvalue=1;};intmain(){cout::valuegcc/clang上的代码都出现错误:模棱两可,但是将decltype更改为void_t是可以的。为什么? 最佳答案 对我来说,这看起来像是一个编译器错误:你真的需要T{}的副作用吗??decltype((void)T{})的整体构造应该

c++ - 编译器无法推断返回类型?

我正在尝试在自动函数上使用decltype关键字:structThing{staticautofoo(){return12;}usingtype_t=decltype(foo());};我得到以下错误(gcc7.4)::6:25:error:useof'staticautoThing::foo()'beforedeductionof'auto'decltype(foo());^:6:25:error:useof'staticautoThing::foo()'beforedeductionof'auto'为什么编译器还没有推导出返回类型? 最佳答案

c++ - sfinae 关于在类主体外部定义的成员函数

有点像我的previousquestion的延续.我得到的是一堆像这样形成sfinae依赖链的函数(让“A->B”符号表示A的存在取决于B的存在):S::f_base->S::f->ns::f_->f->T::f其中T是模板参数。它的实现方式类似于this:#includestructS;templateautof(S&s,Tconst&t)->decltype(t.f(s),void()){t.f(s);}namespacens{templateautof_(S&s,Tconst&t)->decltype(f(s,t),void()){f(s,t);}}structS{templat

c++ - 未知的模板函数返回类型,使用 decltype 时代码重复

在我的工作中,有几个模板数学类(例如矩阵)。可以使用float或double(或其他数字类型,但就此而言,这并不重要)来实现一个对象。一个双重对象只能与另一个双重对象交互。为此,为各种类型实现了函数convert(),其实现类似于:Matrixconvert(constMatrix&m,T2dummy){//createamatrixwithtypeT2andcastmvaluesintoit//retMatrix(i,j)=(T2)m(i,j)}你会这样调用它:autofloatMatrix=convert(doubleMatrix,0.f);或者更详细一点:autofloatMat

c++ - &decltype(object)::memfn 是误用吗?

我上过这样的课:classTest{public:boolbar(int&i,charc)//someargumentsarepassedbyref,somearebyvalue{/*...*/}boolfoo(/*...*/){}};而且我不想重复调用bar1/bar2等然后一次又一次地检查返回值,所以我写了一个宏和可变参数模板来处理这些事情#definehelp_macro(object,memfn,...)help_func(#object"."#memfn,\object,&decltype(object)::memfn,##__VA_ARGS__)templatevoidhe

具有返回类型推导的 C++ 11 运算符重载

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭6年前。Improvethisquestion我有一个依赖于一种类型的模板类(例如templateclassVector)。现在,我想重载算术运算符:我可以将它们与用两种不同类型实例化的Vectors一起使用;结果与模板实例类型的推导方式相同;例子:Vectorfv={1.5,2.5};Vectoriv={1,2};autos1=fv+iv;//s1MUSTbeoftypeVector=={2.5,4.5}autos2=iv+fv;/