草庐IT

c++ - 缩写函数模板与带有转发引用参数的函数模板

有什么区别带有转发引用参数的函数模板templatevoidUniversal_func(T&&a){}和缩写函数模板?voidauto_fun(auto&&a){}我可以用auto_fun替换Universal_func吗?Universal_func是auto_fun还是它们相等?我已经测试了下面的程序。看起来两者是一样的。templatevoidUniversal_func(T&&a){}voidauto_fun(auto&&a){}intmain(){inti;constintconst_i=0;constintconst_ref=const_i;//forwardingref

c++ - 转发引用和正常引用的部分排序与推导指南

gcc8.0.0和clang5.0.0不同意这个程序的行为:#includetemplatestructA{A(constT&){std::coutA(U&&)->A;intmain(){inti=0;constintci=0;Aa1(0);//bothsayAAa2(i);//bothsayAAa3(ci);//gccsaysA,clangsaysA}gcc的行为对我来说没有意义-如果constT&重载优于U&&左值constint重载,对于右值int,为什么T&&重载优于U&&重载?clang对我来说更有意义(没有一个功能比另一个更专业,所以演绎指南胜出)。谁是对的?

c++ - 转发声明模板别名

我有一个使用using指令定义的别名模板:templateusingT=TC;C++11是否提供一种机制来转发声明此模板别名T?我试过:templatestructT;和:templateusingT;但两者都返回编译器错误(“与先前的声明冲突”)。我正在使用gcc4.8。让它工作的语法是什么? 最佳答案 不,这不可能。你要做的是前向声明TC,然后紧接着在它下面定义T。templatestructTC;templateusingT=TC; 关于c++-转发声明模板别名,我们在StackO

c++ - 组合:使用特征来避免转发功能?

假设我们有两个类,A和B。当使用组合来建模“has-a”或“is-implemented-in-terms-of”关系时(例如Bhas-aA),与继承相比的缺点之一是B不包含A的公共(public)功能它需要。为了访问A的公共(public)函数,有必要提供转发函数(与继承相反,其中B将继承所有A的公共(public)功能)。举一个更具体的例子,假设我们有一个Person,它有一个ContactInfo:usingnamespacestd;classContactInfo{public:ContactInfo();voidupdateAddress(stringaddress);voi

c++ - 为什么 T const&& 不是转发引用?

在模板上下文中,应用以下“引用折叠”规则:templatevoidfoo(T&&t){//T&&->T&//T&&&->T&//T&&&->T&//T&&&&->T&&}为什么该语言禁止“通用引用”具有const限定符?templatevoidfoo(Tconst&&t)如果类型已解析为引用(4种情况中的3种),这似乎是有意义的。我确信这个想法与该语言的其他一些设计方面不兼容,但我不能完全看到全貌。 最佳答案 最初右值引用提案说如果P就会发生转换。是“右值引用类型”。However,adefectreport后来注意到了Additi

c++ - 我如何转发声明句柄? (Win32)

如何转发声明HANDLE?我不想在此特定header中包含所有windows.h。 最佳答案 实际上typedefsHANDLE的header是winnt.h。不幸的是,这是15K行-在这里,因此通过包含slimlinewindef.h来解决您的问题有点误导。这是我系统上的相关部分(很明显,细节可能会随着修订而变化,但不会在实现级别发生变化,因为这会破坏现有的二进制文件):////HandletoanObject//#ifdefSTRICTtypedefvoid*HANDLE;#if0&&(_MSC_VER>1000)#define

c++ - 转发右值引用的适当方式

我有以下代码:#include#includeusingstd::cout;usingstd::endl;voidbar(conststd::string&str){cout在上面的代码中voidbar(conststd::string&str)重载被调用。如果我想要voidbar(std::string&&str)要调用的重载我要么必须写bar(std::move(str));或bar(std::forward(str));显然前向代码更长,但对我来说更有意义。我的问题是什么更常用和更喜欢。写作bar(std::forward(str));在我看来,这将是最好的解决方案,但这不是一个

c++ - 如何转发声明应该属于一个类的模板化类型?

假设我有2个类:classA{public:typedefstd::shared_ptrRef;...private:B::Ref_b;}classB{public:typedefstd::shared_ptrRef;...private:A::Ref_a;}这显然需要B类和B::Ref的前向声明。前向声明B很简单,但是如何为B::Ref做到这一点呢? 最佳答案 解决这个问题的方法之一是classA;classB;templatestructTraits{typedefstd::shared_ptrPtr;};classA{priv

c++ - 转发声明一个 constexpr 变量模板

我尝试像这样转发声明一个constexpr变量模板:templateconstexprstd::size_titerator_category_value;目标是记录每个特化都应该是constexpr但我不得不承认我从未检查过它是否合法并且g++对此很满意。然而,当我尝试用clang++编译这个spinnet时,我得到了以下错误:error:defaultinitializationofanobjectofconsttype'conststd::size_t'(aka'constunsignedlong')constexprstd::size_titerator_category_va

c++ - 模板模板参数和转发引用

假设我们有以下代码:templateclassC{};templateclassContainer>voiddummyMe(Container&&){};intmain(intargc,char*argv[]){Cc;dummyMe(c);return0;}由于第一个dummyMe而无法编译参数是右值引用。有人可以用Standardese向我解释为什么模板模板参数与转发引用不一致,为什么用简单的英语就是这样。附言我偶然发现了this和that问题,但我没有在答案中看到任何真正的证据。上面链接的答案和这个问题的答案断言Container不能算作模板参数。我看不出为什么会这样。让我们让这个