草庐IT

c++ - boost::ref 和 boost::asio 完成处理程序,按引用传递

m_io_service.post(boost::ref(i));我在一段代码中有这个调用,底层类型i绝对是一个可调用的(因为删除boost::ref导致按值传递,这工作正常),但是clang告诉我:/opt/dev_64_swat/proto-rpc2/dependencies/boost/include/boost/asio/handler_invoke_hook.hpp:64:3:error:type'boost::reference_wrapper'doesnotprovideacalloperator我如何通过引用传递,我有比异步调用生命周期更长的对象,如果我可以通过引用传递

c++ - const 或 ref 或 const ref 或 value 作为 setter 函数的参数

恒常性classMyClass{//...private:std::stringm_parameter;//...}按值传递:voidMyClass::SetParameter(std::stringparameter){m_parameter=parameter;}通过引用:voidMyClass::SetParameter(std::string¶meter){m_parameter=parameter;}通过常量引用:voidMyClass::SetParameter(conststd::string¶meter){m_parameter=parameter;}按

c++ - 引用变量的地址和值 C++

我刚刚找到了引用变量,几乎没有什么问题让我很困扰。请看下面的代码。inta=3;//&ais0x28feeintb=5;//&bis0x16faaint&ref=a;//&refis0x28feeref=b;//valueofref=5,addressisstill0x28fee我知道引用变量的地址一旦设置就不能更改,但是当我运行命令时,我的引用的值是如何改变的,但地址是一样的?既然地址是一样的,ref的值不应该还是3,或者a的值不应该变成5,因为一个地址怎么可能有两个值呢?最后,假设“&”符号与我们在指针中使用的符号相同是否正确? 最佳答案

c++ - 复制对象时的虚拟表

#include#includeclassA{public:A(inta):_a(a){}virtual~A(){}virtualvoidf()const{std::cout输出:1我了解到,将派生(扩展)类对象复制到基类对象时,派生对象被剪切,只复制基类数据。但我认为'ref'的虚拟表现在应该是'b'的虚拟表所以'ref.f();'应该调用函数:voidB::f()const{std::cout但是在复制之后'ref'的vtbl仍然是类A的vtbl。为什么?谢谢。 最佳答案 首先,“虚拟表”不是标准的C++概念。实现动态绑定(bi

c++ - const ref lvalue to non-const func return value 是否专门减少拷贝?

我遇到了一个C++习惯,我试图研究它以了解它的影响并验证它的用法。但我似乎找不到确切的答案。std::vectorgetThings();voiddo(){conststd::vector&things=getThings();}这里我们有一些返回非const&值的函数。我看到的习惯是在分配函数的返回值时使用const&左值。提出这个习惯的原因是它减少了拷贝。现在我一直在研究RVO(返回值优化)、复制省略和C++11移动语义。我意识到给定的编译器可以选择阻止通过RVO进行复制,不管这里是否使用了const&。但是,在防止复制方面,const&左值的使用对非const&返回值有任何影响吗

c++ - 带有 ref_qualified 成员函数的 std::mem_fn

有什么方法可以通过std::mem_fn使用ref限定的成员函数?下面的代码编译失败:classDeadPool{public:voidjump()&{std::cout错误信息:mem_fn_ex.cc:18:15:error:nomatchingfunctionforcallto'mem_fn'autocobj=std::mem_fn(&DeadPool::jump);//Won'tcompile^~~~~~~~~~~/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/functional:1233:1:not

c++ - 为什么 lambda 会删除 cv 和 ref?

给定一个lambda:autof=[](constT&var){returnvar;};为什么f的返回类型是T(不是constT&)?这在标准中的什么位置? 最佳答案 重点是:使用auto进行返回类型推导采用模板类型推导规则。返回类型被声明为按值传递;这意味着用于推导的表达式的引用性和顶级cv限定符(即var)将被忽略。标准引述:关于auto:Iftheplaceholderistheautotype-specifier,thededucedtypeT'replacingTisdeterminedusingtherulesforte

c++ - std::string& 与 boost::string_ref

如果我在std::string&上使用boost::string_ref还重要吗?我的意思是,在处理字符串时,使用boost::string_ref真的比std版本更有效吗?我真的不明白这里提供的解释:http://www.boost.org/doc/libs/1_61_0/libs/utility/doc/html/string_ref.html.真正让我感到困惑的是std::string也是一个仅指向分配内存的句柄类,并且自c++11以来,具有移动语义的复制操作在上面的文章中提到不会发生。那么,哪个更有效? 最佳答案 strin

c++ - std::ref 和 swap 函数似乎不能很好地协同工作

templatevoidmyswap(Ta,Tb){Ttemp=a;a=b;b=temp;}intmain(){intm(20),n(30);myswap(ref(m),ref(n));//misstill20andnisstill30}为什么m和n的值没有互换?将包装在std::ref中的值传递给INCREMENT函数会导致原始变量(调用INCREMENT函数的堆栈帧中的变量)中的值发生变化。或者,std::ref的使用是否受到限制? 最佳答案 std::ref(及其关联的std::reference_wrapper)是为标准库中

c++ - 显式默认/删除的函数可以在 ref 限定符上重载吗?

简介Refqualifiers:一种消除隐含对象的rl-valuness歧义的方法。作为一个简单的例子,以下面的类为例classexample{intmember;public://...int&value()&;//^int&&value()&&;//^^intconst&value()const&;//^};使用此C++11功能(用^标记的语法),允许我们控制将用value()的版本p>左值临时工常量左值实际上ref限定适用于类的*thisDefaulted/Deletedfunctions:将一个特殊成员函数指定为编译器生成(默认)定义或不可访问(删除)。举个例子structty