草庐IT

c++ - 抛出表达式中是否允许右值省略

在§[except.throw]中,标准规定抛出异常会从throw表达式复制初始化异常对象Throwinganexceptioncopy-initializes(11.6,15.8)atemporaryobject,calledtheexceptionobject为什么下面的代码可以在C++17上编译?classException{public:Exception()=default;Exception(Exception&&)=delete;Exception(constException&)=delete;};intmain(){throwException{};return0;}

c++ - c++0x 中的返回值是否将通过右值引用传递?

假设我有一个函数:typedefstd::vectorVecType;VecTyperandomVector();intprocessing(){VecTypev=randomVector();returnstd::accumulate(v.begin(),v.end(),0);}C++0x是否明确表示将从randomVector的返回值中避免虚假拷贝?或者编译器是否需要实现RVO?在我看来,值randomVector()应该被视为右值,因此应该调用v的移动构造函数,但我不完全确定这是真的。 最佳答案 规则如下如果编译器可以执行RV

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++ - 在可能的情况下,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!但也许有人说的专业知识比我验证的要好?

c++ - 为什么右值没有地址?

为什么右值没有内存地址?它们是在程序执行时没有加载到RAM中,还是引用存储在处理器寄存器中的值? 最佳答案 您的问题(“为什么右值没有内存地址?”)有点令人困惑。右值是一种表达式。表达式没有地址:对象有地址。更正确的问法是“为什么不能将地址运算符应用于右值表达式?”答案很简单:您只能获取对象的地址,并非所有右值表达式都引用对象(例如,表达式42有值但不引用一个对象)。一些右值表达式确实引用对象,但这些对象缺乏持久性。右值表达式引用的对象是临时对象,并在创建它的表达式结束时销毁。这样的对象确实有地址(您可以通过调用临时对象的成员函数轻

C++ 在带有右值缓冲区的 ostream 中使用 snprintf,格式是否正确?

我想知道我是否可以在ostream中使用snprintf格式,这样我就可以在流表达式本身中嵌入对snprintf的调用.这在GCC4.9中编译,但是可以吗?cout 最佳答案 这是格式正确且定义明确的。{}用于复制列表初始化对char[12]的右值引用,它创建一个临时char[12]数组以引用是绑定(bind)的。这个临时值一直存在到完整表达式的末尾-在本例中,直到分号,因此可以安全地返回指向数组中元素的指针并用于在该表达式中打印。(lambda返回一个char*指向这个数组的第一个元素。)标准语:§8.5[dcl.init]/p1

c++ - 在 Visual Studio 2015 中将其他内容与右括号保持在同一行?

我已经设法让VisualStudio像这样将左括号保持在同一行(此设置位于Formatting->NewLines下;我正在寻找的设置,如果它们存在,不在这个选项范围内):voidfoo(){bar();}但我不知道如何将else和catchblock与前一个语句的结束括号保持在同一行。澄清一下,这是VisualStudio自动格式化为:if(foo){return1;}else{return2;}这就是我想要的:if(foo){return1;}else{return2;} 最佳答案 转到工具->选项,然后是常规->文本编辑器->

C++如何右对齐多条数据

所以我必须向std::cout发送一列数据,我还必须在数据周围显示一些字符,例如:PlotPoints(0,0),(2,3)(1,10),(12,14)我必须在列标题的"Points"中的字母"s"下右对齐最后一个右括号。我将数据输出如下:cout但是我看到的所有例子似乎都表明正确和setw似乎只影响我发送到cout的下一条数据,所以在这种情况下仅限"("。有没有办法将所有这些字符和变量组合在一起,使它们在输出列中一起对齐?我刚刚学习C++,所以希望有一些我还没有学过的简单解决方案? 最佳答案 Isthereanywaytogrou

c++ - 重用 "&&" token 作为右值引用背后的基本原理?

我最近举行了一次关于C++11的演讲,主要关注右值和移动语义。在演示过程中提出了一个问题,即为什么标准委员会决定重用“&&”-token而不是引入像“§”这样的新标记。有没有人发现重用&&的基本原理? 最佳答案 委员会想要一个在美式键盘上的token。我们还需要一些不会破坏现有代码的东西。&&似乎是一个显而易见的标记。我们也在寻找对标准的最小更改,重用token而不是发明新token的想法很有吸引力。我相信JohnSpicer(EDG)在2002年4月的库拉索session上首先建议将&&作为token。