草庐IT

C++0x : rvalue reference versus non-const lvalue

在C++03中编程时,我们不能将未命名的临时T()传递给函数voidfoo(T&);。通常的解决方案是给临时命名,然后像这样传递它:Tv;foo(v);现在,C++0x出现了——现在有了右值引用,定义为voidfoo(T&&)的函数将允许我传递一个临时值。这让我想到了我的问题:既然一个接受右值引用的函数既可以接受右值引用(未命名的临时对象)也可以接受左值引用(命名的非常量引用),是否有任何理由在函数参数中再使用左值引用?我们不应该总是使用右值作为函数参数吗?当然,一个接受左值引用的函数会阻止调用者传递一个临时值,但我不确定这是否是一个有用的限制。 最佳答案

c++ - 将 xvalues 转换为 lvalues 以传递给函数是否定义明确?

RecentlyI'vediscovered有时能够临时将右值转换为左值对我有用。我一直在使用以下工具:#includetemplateinlineconstexprstd::remove_reference_t&lvalue(T&&r)noexcept{returnstatic_cast&>(r);}当您必须使用需要左值的函数时,它很有用争论,但你对那些特别的东西没有任何兴趣值变成。当您对其他输出感兴趣时与给定的特定参数无关的vector。例如,这个:std::stringget_my_file(){std::ifstreamifs("myfile.txt");return{std:

c++ - 将 xvalues 转换为 lvalues 以传递给函数是否定义明确?

RecentlyI'vediscovered有时能够临时将右值转换为左值对我有用。我一直在使用以下工具:#includetemplateinlineconstexprstd::remove_reference_t&lvalue(T&&r)noexcept{returnstatic_cast&>(r);}当您必须使用需要左值的函数时,它很有用争论,但你对那些特别的东西没有任何兴趣值变成。当您对其他输出感兴趣时与给定的特定参数无关的vector。例如,这个:std::stringget_my_file(){std::ifstreamifs("myfile.txt");return{std:

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++ - 位域 "In-class initialization"结果为 "error: lvalue required as left operand of assignment"

structbitfield{inti=0;//okintj:8=0;//error:lvaluerequiredasleftoperandofassignment};使用C++11“类内初始化”功能初始化位域的正确语法是什么? 最佳答案 这是作为C++标准的核心问题1341提出的,但在2015年10月被C++核心工作组拒绝为NAD(“不是缺陷”)-参见http://open-std.org/JTC1/SC22/WG21/docs/cwg_closed.html#1341 关于c++-位

c++ - 位域 "In-class initialization"结果为 "error: lvalue required as left operand of assignment"

structbitfield{inti=0;//okintj:8=0;//error:lvaluerequiredasleftoperandofassignment};使用C++11“类内初始化”功能初始化位域的正确语法是什么? 最佳答案 这是作为C++标准的核心问题1341提出的,但在2015年10月被C++核心工作组拒绝为NAD(“不是缺陷”)-参见http://open-std.org/JTC1/SC22/WG21/docs/cwg_closed.html#1341 关于c++-位

C++0x 右值引用 - 左值-右值绑定(bind)

这是一个后续问题C++0xrvaluereferencesandtemporaries在上一个问题中,我问过这段代码应该如何工作:voidf(conststd::string&);//lessefficientvoidf(std::string&&);//moreefficientvoidg(constchar*arg){f(arg);}由于隐式临时性,似乎应该调用移动重载,这发生在GCC而不是MSVC(或MSVC的智能感知中使用的EDG前端)。这段代码怎么样?voidf(std::string&&);//NB:Noconststring&overloadsuppliedvoidg1(

C++0x 右值引用 - 左值-右值绑定(bind)

这是一个后续问题C++0xrvaluereferencesandtemporaries在上一个问题中,我问过这段代码应该如何工作:voidf(conststd::string&);//lessefficientvoidf(std::string&&);//moreefficientvoidg(constchar*arg){f(arg);}由于隐式临时性,似乎应该调用移动重载,这发生在GCC而不是MSVC(或MSVC的智能感知中使用的EDG前端)。这段代码怎么样?voidf(std::string&&);//NB:Noconststring&overloadsuppliedvoidg1(

c++ - std::common_type 应该使用 std::decay 吗?

给定类型A,B,我关心std::common_type的确切定义,不考虑可变参数std::common_type对于任意类型A....所以让usingT=decltype(true?std::declval():std::declval());usingC=std::common_type;现在,根据一些消息来源,我发现了以下关系(为简洁起见,跳过typename):cppreference.com:C::type=std::decay::typecplusplus.com:C::type=TGCC4.8.1实现:C::type=std::decay::type如果T有效,否则C不包含