草庐IT

C++ 左值和右值

全部标签

c++ - 为什么将表达式转换为右值对函数的引用是左值?

在这里,cppreference-lvalue,我发现Castexpressiontorvaluereferencetofunctionislvalue.出于好奇,我进行了如下实验:#includeusingnamespacestd;typedefvoid(&&funr)(int);typedefvoid(&funl)(int);voidtest(intnum){coutvoidfoo(T&&fun){cout::value::value(test));return0;}事实就是如此。为什么将表达式转换为右值的函数引用是左值?是因为函数类型不需要移动语义还是其他什么?或者我理解错了这个

c++ - 为什么 std::move 将右值引用作为参数?

根据cppreference.com,move有签名templatetypenamestd::remove_reference::type&&move(T&&t)noexcept;为什么它需要一个右值引用T&&t作为它的参数?同样当我尝试下面的代码时voidfoo(int&&bar){cout我收到编译器错误“右值引用不能绑定(bind)到左值”这是怎么回事?我很困惑。 最佳答案 这不是一个右值引用,而是一个forwardingreference;这可以保留参数的值类别。这意味着std::move可以接受左值和右值,并将它们无条件地

C++11:为什么允许分配右值?

据我了解,从函数返回右值引用是危险的原因是由于以下代码:T&&f(T&&x){do_something_to_T(x);returnstatic_cast(x);}Tf(constT&x){Tx2=x;do_something_to_T(x2);returnx2;}T&&y=f(T());这使得y成为未定义的悬挂引用。但是,我不明白为什么上面的代码甚至可以编译?是否有合理的理由将右值引用分配给另一个右值引用?粗略地说,右值不应该是“临时值”,即在表达式末尾无效吗?能够分配它们对我来说似乎很愚蠢。 最佳答案 Aren'trvalues

c++ - 调用左值引用构造函数而不是右值引用构造函数

有这段代码:#includeclassF{public:F()=default;F(F&&){std::cout输出是:F(F&)G()为什么在G类的构造函数中调用F(F&)构造函数而不是调用F(F&&)构造函数?G类的构造函数的参数是F&&f,它是右值引用,但调用了左值引用的构造函数。 最佳答案 WhyF(F&)constructoriscalledinsteadofF(F&&)constructorinconstructorofclassG?因为f是一个左值。即使它绑定(bind)到一个右值,并且它的类型是对F的右值引用,它也是

c++ - 如何在模板中存储右值或左值引用

我正在尝试创建一个简单的模板enumerator类,它应该接受定义了:运算符的任何对象,然后打印(i,v[i]).一个简单的实现如下:templatestructenumerator{T&v;//referencetominimizecopyingenumerator(T&_v):v(_v){}voiddo_enumerate(){size_ti=0;for(autox:v){cout这适用于以下情况:案例Avectorv({1,2,6,2,4});autoe=enumerator(v);e.do_enumerate();但是,我也希望它能处理临时对象,例如:案例Bautoe=enum

c++ - 为什么 std::thread 采用右值运行的函数?

std::thread有一件事我不明白:为什么std::thread的构造函数采用右值运行的函数?我通常想将具有一些成员的Functor运行到另一个线程。像这样:structFunction{voidoperator()(/*someargs*/){/*somecode*/}/*somemembers*/}voidrun_thread(){Functorf(/*somedata*/);std::threadthread(f,/*somedata*/);/*dosomethingandwaitforthreadtofinish*/}随着std::thread的当前实现,我必须确保我的对象

c++ - 右值函数重载

我想重载一个函数,以便它以某种方式操纵它的参数,然后返回对参数的引用——但如果参数不是可变的,那么它应该返回一个被操纵的拷贝相反的论点。在弄乱它很长时间之后,这就是我想出的。usingnamespacestd;string&foo(string&in){in.insert(0,"hello");returnin;}stringfoo(string&&in){returnmove(foo(in));}stringfoo(conststring&in){returnfoo(string(in));}这段代码似乎可以正常工作,但我很想知道是否有人能想出更好的方法。这是一个测试程序:intma

串行事件值和串行端口值之间的差异

我正在使用JSSC来读取串行端口的值。一开始,我将以下回调写入串行端口。在该回调中,我可以从事件和串行端口本身中获取值都包含不同的值。我想知道串行端口值和串行事件值之间的差异是否包含来自串行端口的值?publicclassPortReaderimplementsSerialPortEventListener{SerialPortserialPort;publicPortReader(SerialPortserialPort){this.serialPort=serialPort;}@OverridepublicvoidserialEvent(SerialPortEventevent){Syst

c++ - 为什么我可以 std::move 流右值引用到左值引用?

据我了解C++11引用,我不应该能够将右值引用绑定(bind)到(非常量)左值引用,因为前者可能绑定(bind)到临时对象,而后者绝不能绑定(bind)到一个临时的。但是我发现这种奇怪的行为与临时流对象有关(我尽可能地减少了)structDummy{};templateStream&operatorvoidpass(Stream&&s){std::move(s)lvalueconversion?}#includeintmain(){pass(std::fstream("test",std::ios::out));}如果我写s在线(X),C++在(A)行提示,说error:invalid

c++ - const 左值引用和右值引用之间的重载解析

#include#includevoidfnc(conststd::string&){std::cout所有编译器都选择std::string&&版本的fnc,这是合乎逻辑的,因为创建了临时的std::string用于引用绑定(bind),但我找不到它在C++14标准中的描述。我在那里找到了一段(3.2):—StandardconversionsequenceS1isabetterconversionsequencethanstandardconversionsequenceS2if[...]—S1andS2arereferencebindings(8.5.3)andneitherre