草庐IT

c++ - 为什么 std::bind 可以分配给参数不匹配的 std::function?

我的代码如下:#include#includeusingnamespacestd;voidF(intx){coutf1=std::bind(F,std::placeholders::_1);f1(100);//Thisworks,willprint100.intx=0;std::functionf2=std::bind(F,x);f2();//Thisworks,willprint0.std::functionf3=std::bind(F,x);f3(200);//BUTWHYTHISWORKS??????Itprints0.return0;}我的编译器信息是:AppleLLVM版本6

c++ - 右值的生命周期绑定(bind)到静态常量引用

考虑一下:std::stringfoo();voidbar(){conststd::string&r1=foo();staticconststd::string&r2=foo();}我知道第一次调用foo()产生的字符串的生命周期将延长到r1的生命周期。但是,临时绑定(bind)到r2呢?它会一直存在到范围结束,还是在重新输入bar()时仍然存在?注意:我对特定编译器是否这样做不感兴趣。(我对我们使用的那个很感兴趣,我可以用它轻松测试。)我想知道标准对此有何规定。 最佳答案 临时延长到引用的生命周期。[C++14:12.2/5]:T

c++ - 右值的生命周期绑定(bind)到静态常量引用

考虑一下:std::stringfoo();voidbar(){conststd::string&r1=foo();staticconststd::string&r2=foo();}我知道第一次调用foo()产生的字符串的生命周期将延长到r1的生命周期。但是,临时绑定(bind)到r2呢?它会一直存在到范围结束,还是在重新输入bar()时仍然存在?注意:我对特定编译器是否这样做不感兴趣。(我对我们使用的那个很感兴趣,我可以用它轻松测试。)我想知道标准对此有何规定。 最佳答案 临时延长到引用的生命周期。[C++14:12.2/5]:T

c++ - 为什么右值引用绑定(bind)到 xvalue 在我的代码中不起作用?

我试图理解C++11中的左值和右值。于是我写了一段测试代码:intx=10;intfoo(){returnx;}int&bar(){returnx;}int&&baz(){return10;}intmain(){int&lr1=10;//error:lvaluereferencesrvalueint&lr2=x;//okint&lr3=foo();//error:lvaluereferencesrvalueint&lr4=bar();//okint&lr5=baz();//error:lvaluereferencesrvalueint&&rr1=10;//okint&&rr2=x;//

c++ - 为什么右值引用绑定(bind)到 xvalue 在我的代码中不起作用?

我试图理解C++11中的左值和右值。于是我写了一段测试代码:intx=10;intfoo(){returnx;}int&bar(){returnx;}int&&baz(){return10;}intmain(){int&lr1=10;//error:lvaluereferencesrvalueint&lr2=x;//okint&lr3=foo();//error:lvaluereferencesrvalueint&lr4=bar();//okint&lr5=baz();//error:lvaluereferencesrvalueint&&rr1=10;//okint&&rr2=x;//

c++ - 与 C++11 lambda 相比,bind() 是否有任何优势(除了兼容性)?

我正在考虑将我的代码迁移到使用C++11风格的lambda,而不是到处使用bind。但我不确定这是否是个好主意。是否使用例如boost::lambda(或boost::phoenix)比C++11风格的lambda有什么实际优势吗?改用lambdas是个好主意吗?我应该迁移我的代码吗? 最佳答案 主要优点是多态仿函数。目前,C++11lambda是单态的,即它们只接受单个参数类型,而bind()允许您创建接受任何参数类型的仿函数,只要绑定(bind)仿函数可以用它调用.#includestructX{templatevoidoper

c++ - 与 C++11 lambda 相比,bind() 是否有任何优势(除了兼容性)?

我正在考虑将我的代码迁移到使用C++11风格的lambda,而不是到处使用bind。但我不确定这是否是个好主意。是否使用例如boost::lambda(或boost::phoenix)比C++11风格的lambda有什么实际优势吗?改用lambdas是个好主意吗?我应该迁移我的代码吗? 最佳答案 主要优点是多态仿函数。目前,C++11lambda是单态的,即它们只接受单个参数类型,而bind()允许您创建接受任何参数类型的仿函数,只要绑定(bind)仿函数可以用它调用.#includestructX{templatevoidoper

c++ - 复制省略是否适用于结构化绑定(bind)

强制复制省略是否适用于通过结构化绑定(bind)进行的分解?这适用于以下哪些情况?//oneauto[one,two]=std::array{SomeClass{1},SomeClass{2}};//twoauto[one,two]=std::make_tuple(SomeClass{1},SomeClass{2});//threestructSomething{SomeClassone,two;};auto[one,two]=Something{};我怀疑只有第三种情况允许复制省略,因为前两种情况将通过std::get“分解”和std::tuple_size和std::get当参数是

c++ - 复制省略是否适用于结构化绑定(bind)

强制复制省略是否适用于通过结构化绑定(bind)进行的分解?这适用于以下哪些情况?//oneauto[one,two]=std::array{SomeClass{1},SomeClass{2}};//twoauto[one,two]=std::make_tuple(SomeClass{1},SomeClass{2});//threestructSomething{SomeClassone,two;};auto[one,two]=Something{};我怀疑只有第三种情况允许复制省略,因为前两种情况将通过std::get“分解”和std::tuple_size和std::get当参数是

c++ - 结构化绑定(bind)的用例是什么?

C++17标准引入了一个新的structuredbindings功能,最初是proposed2015年,其句法出现广泛discussed稍后。当您查看文档时,就会想到它们的一些用途。聚合分解让我们声明一个元组:std::tuplet(42,"foo");使用结构化绑定(bind)可以很容易地在一行中获得命名的元素拷贝:auto[i,s]=t;相当于:autoi=std::get(t);autos=std::get(t);或inti;std::strings;std::tie(i,s)=t;对元组元素的引用也可以轻松获得:auto&[ir,sr]=t;constauto&[icr,scr