草庐IT

c++ - 函数指针数组的类模板参数推导适用于 clang,但不适用于 gcc

以下代码:#includetemplateautof(){}intmain(){std::array{f};}使用clang7.0编译,但使用gcc8.2失败并显示消息prog.cc:Infunction'intmain()':prog.cc:7:20:error:classtemplateargumentdeductionfailed:std::array{f};^prog.cc:7:20:error:nomatchingfunctionforcallto'array()'Infileincludedfromprog.cc:1:/opt/wandbox/gcc-8.2.0/inclu

c++ - std::min/max 类型推导在 linux 和 windows 上不同

在下面的代码中,std::min/max的模板类型推导似乎很奇怪,我想知道为什么以及如何正确修复它。以下适用于WindowsVS2013,并在GCC-4.8上给出编译错误:(错误见下文)intminX=max(min(floor(v1[0]),min(floor(v2[0]),floor(v3[0]))),0.0f);这在GCC-4.8上编译但在VS2013上给出编译错误:(错误见下文)intminX=max(min(floor(v1[0]),min(floor(v2[0]),floor(v3[0]))),0.0);v[1-3]是cv::Vec3fv1,v2,v3;在OpenCV中,c

c++ - 默认模板模板参数值是否推导上下文?

我真的很惊讶gcc和clang都接受这个代码:#include#include#includetemplateclassTT,classY>Tfoo(TT){}intmain(){static_assert(std::is_same{})),std::allocator>::value);}gcc和clang是否正确认为默认模板模板参数的值是推导上下文还是编译器扩展? 最佳答案 当你写作时templateclassTT,classY>Tfoo(TT);相当于templateclassTT,classY>Tfoo(TT);因此可以推导

c++ - 推导指南和注入(inject)的类名

templatestructX{templateX(Itera,Iterb){}templateautof(Itera,Iterb){returnX(a,b);}};在《C++模板,完整指南》第2版中,有前面的例子是关于带有注入(inject)类名的隐式推导指南的副标题。作者提到类参数推导对于注入(inject)的类名是禁用的,因为f的返回类型将是X。由于隐含的演绎指南。但我相信模板构造函数的隐式推导指南更像是下面的。templateX(Itera,Iterb)->X;我的问题是在那种情况下如何推导类模板参数类型T和Iter是两种不同的类型,参数类型仅依赖于Iter.同样,即使可以以某

c++ - 如果对可推导类型进行替换,可变参数模板类型推导会使编译器崩溃

我想我在所有编译器中都遇到了模板类型推导错误,但在报告之前我想确保我没有遗漏任何东西。考虑一个例子:#includetemplatevoidfoo(std::index_sequence,decltype(I)...,T...){}intmain(){foo(std::make_index_sequence{},1,2,3,4,5);}decltype(I)此处用于使MWE更短。海湾合作委员会:error:toofewargumentstofunctionClang崩溃error:nomatchingfunctionforcallto'foo'MSVC崩溃errorC3543:'unk

c++ - 有什么方法可以跟踪任何编译器的模板参数推导吗?

当编译器试图推导模板参数类型时,无论成功与否,我都在寻找从编译器逻辑中获取一些跟踪日志的方法。因此,例如,给定代码:#include#include#includetemplatedecltype(auto)foo(T&&t)->decltype(t+t){returnt+t;}templatedecltype(auto)foo(T&&t)->decltype(t.size()){returnt.size();}intmain(){std::cout{1,2,3})我很想收到这样的东西:foo(10)candidate:decltype(auto)foo(T&&t)->decltype

C++17 部分推导指南

我正在尝试编写一个推导指南,它只检测给定构造函数参数中的许多类型名之一,并要求用户手动输入intsizetemplatestructBoard{array,size>values;explicitBoard(constvector&raw_values){}};templateBoard(constvector&)->Board;上面的想法是仍然应该强制用户输入模板的参数“intsize”,但是应该从构造函数的参数中推导出“typenameT”,这可能吗?正确规范后,方法应该这样调用autob=Board(initialStateVector);目前要求我这样输入;autob=Boar

c++ - 类模板的 C++1 7's "模板参数推导可以推导局部类型吗?

P0091R3("Templateargumentdeductionforclasstemplates")最近添加到gcctrunk并且可以在wandbox上进行测试.我的想法是使用它来实现一个“作用域守卫”只需几行代码:scope_guard_([]{cout我试过了implementingitonwandbox...templatestructscope_guard:TF{scope_guard(TFf):TF{f}{}~scope_guard(){(*this)();}};intmain(){scope_guard_{[]{}};}...但是编译失败并出现以下错误:prog.cc

c++ - Clang claims that `member reference base type ' X' is not a structure or union`,但 X 是具有推导参数的结构模板

考虑以下代码:templatestructX{X(T){}voidfoo(){}};templatestructY{intobject=0;voidbar(){X(object).foo();}};Liveongcc.godbold.orgGCC8.2编译它,而Clang7吐出以下错误::13:18:error:memberreferencebasetype'X'isnotastructureorunionX(object).foo();~~~~~~~~~^~~~这对我来说像是一个错误。条件非常具体:如果任一结构不是模板,或者object不是成员变量,或者不涉及CTAD(类模板参数推导

c++ - 即时推导

有一个不太常见的C++习语,我过去曾多次使用它,效果很好。我似乎不记得它是否有一个普遍使用的名称来描述它。和mixins有点关系,CRTP和type-erasure,但具体不是这些东西中的任何一个。当您想向某个类添加一些实现,但又不想将它放在该类或它派生的任何类中时,就会发现问题。这样做的一个原因可能是该类可能是继承层次结构的一部分,在该继承层次结构中,实现应该只发生一次。暂时搁置诸如层次结构是否应该具有具体的非叶类,或者在某些情况下虚拟继承是否可能是一种选择等问题,我知道一种解决方案是在模板类中提供实现派生自它的模板参数。这样一来,您就可以在创建实例时使用模板,但之后只能通过指针或引