草庐IT

decltype-auto

全部标签

具有用户类型的 C++20 模板 <auto> 导致 GCC 9 中的 T/const T 类型不匹配

我正在尝试将非类型模板与自定义类型结合使用。structT{};templatestructU{};templatevoidf(U){}intmain(){constexprTt;f(U{});//OKf(U{});//OKf(U{});//Error}模板参数推导失败,gcctrunkwith-std=c++2agetsyop.cpp:10:5:note:templateargumentdeduction/substitutionfailed:yop.cpp:19:21:note:mismatchedtypes‘T’and‘constT’19|f(U{});//Error|^我是不是

c++ - 这两个来源之间是否存在关于 `auto_ptr` 模板类的矛盾?

这site关于“所有权、来源和汇”的陈述:“当您复制auto_ptr时,您会自动将所有权从源auto_ptr转移到目标auto_ptr;如果目标auto_ptr已经拥有一个对象,则该对象首先被释放。复制后,只有目标auto_ptr拥有该指针,并会在适当的时候将其删除,而源将设置回空状态,不能再用于引用拥有的对象。".现在考虑operator=()的定义对于templacteclassauto_ptr,在Stroustrup的TheC++ProgrammingLanguageThirdEdition第14章第368页中:auto_ptr&operator=(auto_ptr&a)thro

c++ - VS2012 上的 decltype 内没有 ADL

我刚刚意识到尝试通过decltype获取函数的返回类型不涉及VS2012上的ADL(参数依赖查找)(使用cl.exeV17.00.60610.1测试)。下面的例子#include#includenamespaceA{intFunc(voidconst*){printf("A::Func(voidconst*)\n");return0;}templatevoidDo(Tconst&t){Func(&t);}templatevoidPrintType(Tconst&t){printf("Type:%s\n",typeid(decltype(Func(&t))).name());}}name

c++ - 函数参数列表中的 auto 暗示模板参数

在他的talkatcppcon(约13分钟),AndrewSutton提到您将“很快”能够写作autofunc(autoa,autob){...}这将被理解为templateautofunc(Ta,Ub){...}就像在C++14中为通用lambda引入的那样。此功能的名称是什么?这是ConceptsLite的一部分,还是单独提出的?如果确实有人提出,这显然没有进入C++14;如果有人知道,反对意见是什么? 最佳答案 缩写函数模板是的,它是ConceptsLite的一部分它在概念TS中,它远未为C++14做好准备。在thelates

c++ - decltype 和隐藏外部名称的类成员名称之间的交互

这段代码intclash;structFoo{decltype(clash)clash;};在clang上静默编译,但在gcc上编译失败并给出错误error:declarationof'intFoo::clash'[-fpermissive]error:changesmeaningof'clash'from'intclash'[-fpermissive]错误的产生似乎需要2个成分:阴影必须由类成员完成(如果它是函数的局部作用域则没问题)。decltype([shadowedname])必须在声明[shadowingname]之前的阴影范围内使用。我的问题有两个:gcc拒绝此代码是否合理

c++ - 从 decltype(someFunction) 中仅提取参数类型列表

我有一个表示函数参数列表的可变参数模板,例如:voidmyFunc(int,int,std::string){}templateclassMyTemplateClass{};...MyTemplateClassmyConcrete;//forusewithmyFunclater有什么办法可以只从decltype(func)中提取参数类型,而不必手动编写它们,例如:MyTemplateClassmyConcrete;在这种情况下,即decltype会给我“void(int,int,string)”,但是有没有一种方法可以只提取“int,int,string”部分以用于可变参数模板?注意:

C++11 auto 和 size_type

鉴于auto的以下用法:std::vectorv;for(autoi=0;i对于C++来说,推导i将是理想的选择作为std::vector::size_type,但如果它只查看i的初始化程序,它会看到一个整数。i的推导类型是什么?在这种情况下?这是auto的适当用法吗?? 最佳答案 使用decltype而不是auto来声明i。for(decltype(v.size())i=0;i更好的是,如@MarkB的回答所示,使用迭代器迭代vector。 关于C++11auto和size_type,

c++ - 'auto' 关键字有什么意义?

所以我理解在C#中使用var是有意义的,因为你有编译器派生的匿名类型。C++似乎没有此功能(除非我错了),那么使用auto关键字有什么意义呢?(这有点酷,与C#不同,auto确实适用于成员/全局变量,我想这很酷,但似乎不足以证明它的存在)。 最佳答案 auto归结为通用编程和节省程序员的输入时有很多用途。例如,考虑这个。你愿意输入:std::unique_ptrg=std::make_unique(1,2,3,4)或:autog=std::make_unique(1,2,3,4)是的,它们都很长,但我们知道返回类型并再次指定它输入起

c++ - 关于 const decltype(x)& 的问题

考虑以下代码:inta=1;constint&b=a;std::cout();它在clang3.5上编译,而GCC4.9给出以下错误:错误:“const”限定符不能应用于“constint&”根据标准,哪个是正确的?我的猜测是GCC符合标准,就像您不能执行int&constb=a;一样。 最佳答案 我相信代码是有效的并且两种类型是相同的。[dcl.ref]/1说:Cv-qualifiedreferencesareill-formedexceptwhenthecv-qualifiersareintroducedthroughtheus

c++ - decltype(foo(1)) 应该实例化 constexpr 函数模板 foo 吗?

以下代码使用gcc和MSVC编译,但使用clang失败,我使用clang-3.5和当前主干进行了测试。templateconstexprautowrong=false;templateconstexprautofoo(constTt)->int{static_assert(wrong,"");return{};}usingF=decltype(foo(1));intmain(){}clang实例化函数体并偶然发现static_assert。gcc和MSVC只看函数声明,忽略函数体中的static_assert。如果删除constexpr,所有编译器都能正常编译代码。问题:如果声明了返回