草庐IT

c++ - 范围末尾的左值可以被视为右值吗?

编辑:考虑以下2个示例:std::stringx;{std::stringy="extremelylongtext...";...x=y;//***(1)}do_something_with(x);structY{Y();Y(constY&);Y(Y&&);...//many"heavy"members};structX{X(Yy):y_(std::move(y)){}Yy_;}Xfoo(){Yy;...returny;//***(2)}在这两个示例中,第(1)和(2)行的y都接近其生命周期的尽头,即将被销毁。很明显,它可以被视为右值并在两种情况下都可以移动。在(1)中,它的内容可以移

c++ - ISO C 中数组的左值到右值转换

C++ANSIISOIEC148822003附件C.1(第668页):改变:条件表达式、赋值表达式或逗号表达式的结果可能是左值理由:C++是面向对象的语言,比较重视左值。例如,函数可能返回左值。对原始特征的影响:更改为定义明确的特征的语义。某些隐式依赖左值到右值转换的C表达式将产生不同的结果。例如,chararr[100];sizeof(0,arr)在C++中产生100,在C中产生sizeof(char*)。...我今天才读到这篇文章,我记得几个月前我的一个friend提出了一个问题,即编写一个函数,如果它是用C++编译的,它将返回0,如果它是用C编译的,则返回1.我利用在C中结构在外

c++ - 左值的 decltype 括号语法

我试图更好地理解decltype以确定编译时表达式的类型。比方说,我用一个双变量来做:#include#includeintmain(){doublea;typedefdecltype(a)a_type;typedefdecltype((a))ref_a_type;typedefdecltype(a)&o_ref_a_type;a_typeb;ref_a_typec=b;o_ref_a_typed=b;if(std::is_same::value)std::cout::value)std::cout::value)std::cout如果我没有理解错的话,这些观点应该是正确的:如果a是左

c++ - 左值绑定(bind)到右值引用

我想了解左值如何绑定(bind)到右值引用。考虑这段代码:#includetemplatevoidf(T&&x){std::cout虽然调用f()没问题,但调用g()会出现编译时错误。这种绑定(bind)是否仅适用于模板?为什么?我们可以在没有模板的情况下以某种方式做到这一点吗? 最佳答案 由于T是一个模板参数,T&&成为一个转发引用。由于引用折叠规则,对于左值,f(T&&&)变为f(T&)而f(T&&)变为f(T&&)用于右值。 关于c++-左值绑定(bind)到右值引用,我们在Sta

c++ - C++ 中何时引入了左值引用?

C++中何时引入了左值引用?Google搜索此问题会为我返回强调Rvalue引用的文章。我的问题是关于左值引用(单个&)。它们是在哪个版本的C++中引入的? 最佳答案 引用文献出现在1985年的第一版“C++编程语言”中,当时该语言尚未标准化。但自从1983年从“CwithClasses”重命名为“C++”后,它们就存在了。参见http://www.stroustrup.com/hopl2.pdf中的3.3. 关于c++-C++中何时引入了左值引用?,我们在StackOverflow上找

c++ - 从临时对象返回左值引用

当*this是右值时,是否允许返回对*this的左值引用?#include#includeusingnamespacestd;classA{public:A&f(){return*this;}stringval()const{return"works";}};intmain(){coutf()返回的值在某些时候是否会成为悬空引用?如果这是一个右值,那么调用f()会延长调用者的生命周期吗? 最佳答案 *this从来都不是右值,但在这种情况下,它是(对)临时值的(引用)。临时对象在定义它们的语句完成之前是有效的对象,即直到代码到达终止;

c++ - C++ 中的赋值运算符返回右值还是左值?

C++中的赋值运算符返回右值还是左值?如果它是左值,两个参数中的哪一个会在这里递增?(a=b)++ 最佳答案 它返回一个左值。根据§5.17:Theassignmentoperator(=)andthecompoundassignmentoperatorsallgroupright-to-left.Allrequireamodifiablelvalueastheirleftoperandandreturnanlvaluereferringtotheleftoperand.如果那些对象有一个用户定义的赋值运算符,那么它取决于opera

c++ - 删除右值,保留左值引用(标准类型特征可用?)

我正在尝试编写一个函数,以std::tuple的形式返回可变参数包的子集。理想情况下,该函数应该没有运行时开销(没有不必要的拷贝),并且它应该允许用户访问lvalue引用并修改它们。应维护值类型、lvalue引用和constlvalue引用。临时对象(rvalue引用)应“转换”为值类型以避免创建无效引用(对临时对象的引用)。期望结果示例:intlr=5;constint&clr=lr;autot=make_subpack_tuple(lr,clr,5);static_assert(is_same>{},"");//Ok,modifieslr:std::get(t)=10;//Comp

c++ - std::move 是否与左值引用一起使用? std::move 如何在标准容器上工作?

#includestructA{inta[100];};voidfoo(constA&a){std::vectorvA;vA.push_back(std::move(a));//howdoesmovereallyhappen?}intmain(){Aa;foo(a);}上面的代码编译正常。现在到处都写着move避免复制。以下是我的查询:move在处理左值时真的有效吗[非]-const引用?即使有“右值引用”,对象复制时如何避免复制像上面一样插入标准容器中?例如voidfoo(A&&a){//supposeweinvokethisversionstd::vectorvA;vA.push_

c++ - 在可能的情况下,C++ 是否总是更喜欢右值引用转换运算符而不是 const 左值引用?

在编写转换运算符时,如果我同时提供到constT&和T&&的转换,C++是否会尽可能优先选择右值运算符?在这个小测试中似乎是这样:#include#includestructholds{operatorint&&(){printf("moving!\n");returnstd::move(i);}operatorconstint&()const{printf("copying!\n");returni;}private:inti=0;};intmain(){holdsh;intval=h;}打印:╰─▸./testmoving!但也许有人说的专业知识比我验证的要好?