草庐IT

c++ - 如果右值没有绑定(bind)到 const 引用,这将如何影响移动语义和完美转发?

在http://www.reddit.com/r/IAmA/comments/1nl9at/i_am_a_member_of_facebooks_hhvm_team_a_c_and_d/ccjm2qs,AndreiAlexandrescu写道:IthinkbindingrvaluestoconstreferenceshasbeenthesmallmistakethatcausedthervaluereferencesHindenburg...Itwouldbealongdiscussion.Bindingrvaluestoconst&madesensewhenfirstintroduc

c++ - 对 std::optional 的转发引用构造函数的约束

std::optional截至目前有8个构造函数,列在下面(也在此处http://en.cppreference.com/w/cpp/utility/optional/optional)/*(1)*/constexproptional()noexcept;/*(1)*/constexproptional(std::nullopt_t)noexcept;/*(2)*/constexproptional(constoptional&other);/*(3)*/constexproptional(optional&&other)noexcept(/*seebelow*/);template/

c++ - 完美转发结构的可变模板参数

在我的C++11代码中,我有一个可变结构和一个函数,该函数应该对结构的可变类型使用完美转发,例如:templatestructS{voidX(T&&...args){Do(std::forward(args)...);}};假设Do是一个独立的可变参数函数。给定一个类型structV{intx,y;};我想这样调用S::X:Ss;Vv={1,2};s.X(V());//Compiless.X(v);//Doesnotcompile最后一行在VisualStudio2013和VisualStudio2013中使用C++编译器的2013年11月CTP产生以下错误:errorC2664:'v

C++ 将非模板成员函数调用转发到模板函数

我想在我的类“Record”中隐藏一个std::tuple并在其上提供一个operator[]来访问元组的元素。不编译的天真代码是这样的:#includetemplateclassRecord{private:std::tuplelist;public:Record(){}autooperator[](std::size_tn)->decltype(std::get(list)){returnstd::get(list);}};intmain(){Recordr;r[0];return0;}g++4.6说:x.cc:13:32:error:nomatchingfunctionforca

c++ - 使用 C++11 将可变函数参数转发给可变函数

我想将调用转发到具有可变参数方法的库。我能想出的最简单的例子来重现这个问题:voidBar(intuseless,...){//Doessomething}templatevoidFoo(intuseless,Args...args){Bar(useless,args...);}如您所见,我试过了。但是,即使编译成功,它似乎也会导致堆栈出现摇摆不定,我在应用程序退出时看到错误。我可以从编译器的角度理解这个解决方案是有问题的。我不确定如何让它工作,或者是否有可能让它工作。我看到有人建议在类似情况下使用“索引技巧”,但我无法在这个特定场合下使用它。感谢任何帮助!

c++ - 为什么转发引用不是常量?

转发引用应该将参数转发给另一个函数,对吧?那为什么它不是const呢?templatevoidfunc(constT&&);非常量引用允许函数修改其参数(而不是仅仅转发它们)。 最佳答案 Whyisn'tforwardingreferenceconst?因为希望能够移动一个完美转发的xvalue。通常不能从const引用移动对象,因为移动构造函数的参数需要是非常量。此外,希望能够将左值绑定(bind)到转发引用中。不可能将左值绑定(bind)到constT&&中,这是一个const右值引用-它根本不是转发引用1。如果您不想离开论点,

c++ - 转发声明结构时出错 : "has a previous declaration here"

在构建我的小型C++项目时,出现以下2个错误,无法找出原因:错误:在“结构”之后使用类型定义名称“TTF_Font”。指向Foo.h中的以下代码行:structTTF_Font;。错误:“TTF_Font”在此之前有一个声明。指向以下代码行:typedefstruct_TTF_FontTTF_Font;inSDL_ttf.h。我已将其缩小到新测试项目中的以下文件:Foo.h:#ifndefFOO_H#defineFOO_HstructTTF_Font;classFoo{TTF_Font*font;};#endif//FOO_HFoo.cpp:#include"Foo.h"#includ

c++ - 完美转发一个仿函数

我想知道使用完美转发仿函数的正确方法是什么?这是两个代码片段。哪个最好,如果都不是,最好的形式是什么?templatevoidcallMe(T&&func,Args&&...args){func(std::forward(args)...);}或者templatevoidcallMe(T&&func,Args&&...args){std::forward(func)(std::forward(args)...);}编辑:它会影响过载解析吗?如果func的operator()有&&或const&的ref-qualifier,我应该做后者吗版本,我应该关心调用哪个重载吗?谢谢!

c++ - 转发模板优先于过载

我认为如果参数也匹配的话,非模板总是优先于模板。但是:templatevoidTrace(Args&&...args){throw"whatthefrak";}voidTrace(constint&){}intmain(){Trace(42);}Thisthrows除非我制作非模板Trace(int)或Trace(int&&),即不使用constref.这有点烦人,因为我想为特定参数类型提供不同的实现,而模板的实际实现没有意义(事实上,不会编译)。我可以通过使第二个函数成为特化来修复它,但前提是我通过采用右值引用来匹配参数类型:templatevoidTrace(int&&){}而且,

c++ - 为什么 std::search 需要转发迭代器

我的问题与下面的线程相同,我很难理解给出的答案,或者更确切地说,我的代码不应该工作,因为它只使用输入迭代器..但我的func似乎工作并且行为与std相同::search..所以我很茫然,不愿意在没有正确理解的情况下继续前进......也许如果有人可以提出一个会破坏我的功能但不会破坏std::的输入来自WhydoIneedaForwardIteratortoimplementmycustomizedstd::search:Iamstudyingthebook"AcceleratedC++"fromKoenig&Moo.Exercise8-2askmetoimplementonmyowns