草庐IT

c++ - "if"c++ 中的语句不从左到右计算条件

我指的是问题“"IF"argumentevaluationorder?”以了解c++中“if”语句的评估顺序。这是if语句中的条件以错误的顺序求值的代码。#includeusingnamespacestd;intmain(){intt=0;if((1/t)==1&&t!=0){cout结果为1而不是浮点异常。 最佳答案 被零除是未定义的行为。任何事情都有可能发生。[expr.mul]/4Ifthesecondoperandof/or%iszerothebehaviorisundefined.

c++ - clang 左/右 3.6 倍表达式

我正在尝试使用clang3.6'--std=c++1z'的折叠表达式,但我不太明白。我正在测试的功能是:autominus=[](auto...args){return(args-...);};...std::cout根据n4191,我期待它扩展为左折叠到(10-3)-2给出结果5,然而,结果是9,这似乎是一个正确的折叠展开,即10-(3-2)我是否遗漏了什么或误解了n4191?谢谢 最佳答案 n4191由n4295修订.据此,(eop...)形式的表达式是一个一元右折叠,它被扩展为:E1op(...op(EN-1opEN)),即作

c++ - 将从函数返回的右值分配给另一个右值

classTest{public:intn1;};Testfunc(){returnTest();}intmain(){func()=Test();}这对我来说没有意义。如何以及为什么允许这样做?它是未定义的行为吗?如果一个函数返回一个右值,那么如何将一个右值设置为另一个右值呢?如果我用任何原始类型尝试这样做,它会像我预期的那样给我一个错误。我知道左值是内存中的一个位置,那么函数是否创建一个临时左值(右值?)并将其分配给另一个左值?谁能解释一下这种语法是如何工作的? 最佳答案 函数调用表达式的值类别实际上是一个右值。事实上,您不能在

c++ - 为什么这个右值调用不明确?

为什么这个右值调用不明确?我可以使用AA和AA&,编译器将知道使用AA&。但是当我添加第三个选项时,我得到了一个错误。显然AA&&比其他的重载更好,比如int的int比long更好。为什么这是模棱两可的?有没有一种方法可以保留所有3个重载并明确我想要哪个?(类型转换(AA&&)不会这样做)。structAA{void*this_;AA(){this_=this;}//notvalid,useAA&,AA(AAa){this_=this;}AA(AA&a){this_=this;}AA(AA&&a){this_=a.this_;}};voidmovetest(AAs){}voidmove

c++ - 允许使用右值捕获但不分配给的运算符重载

是否有可能为我的类C设计重载的operator+以使其成为可能:C&&c=c1+c2;但这不可能:c1+c2=something;编辑:我将对象更改为小写字母。c1、c2和c是类C的对象。&&不是逻辑运算符&&,而是右值引用。例如写:double&&d=1.0+2.0;是100%正确的(新的)C++代码,而1.0+2.0=4.0;显然是编译器错误。我希望完全相同,但我的类C不是双倍的。第二次编辑:如果我的运算符返回C或C&,我可以对右值引用进行赋值,但也可以对c1+c2进行赋值,这是毫无意义的。在这里给出const会禁用它,但是它也会禁用对右值的赋值。至少在VC++2k10上。那么这是

c++ - 由于右值引用,C++0x 中的 std::swap 是原子的吗?

因为我们在C++0x中有右值引用,所以在我看来,应该可以将std::swap实现为CAS的原子操作。新标准是否属于这种情况?如果不是,原因是什么? 最佳答案 它不是原子的。原子操作并不便宜,99%的时间你不需要原子性。有(IIRC)一些其他方法来获得原子操作,但std::swap()不是其中之一。 关于c++-由于右值引用,C++0x中的std::swap是原子的吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverf

c++ - 我可以重用右值引用参数来返回右值引用吗?

考虑以下代码:structMyString{//somectorsMyString&operator+=(constMyString&other);//implementedcorrectly};MyStringoperator+(constMyString&lhs,constMyString&rhs){MyStringnrv(lhs);nrv+=rhs;returnnrv;}MyString&&operator+(MyString&&lhs,constMyString&rhs){lhs+=rhs;returnstd::move(lhs);//returnthervaluerefere

c++ - 获取 clang 格式以将多行函数调用的右括号放在单独的行上?

我一直在使用clang格式来帮助保持我的代码整洁。对于多行函数调用,有什么方法可以让clang将右括号放在它自己的行上?示例:它现在在做什么:increment_and_call_on_match(clique_colors,0,max_clique_color,[&](intclique_color){comms.emplace_back(context.split_by_color(clique_color));},[&](int){context.split_by_color();});我想要的:increment_and_call_on_match(clique_colors,

c++ - 从现在开始,所有 C++ 函数都应该声明为采用右值吗?

为什么我应该或不应该创建我的所有函数和成员函数来采用rvalue而忽略采用lvalue的版本?您总是可以将lvalue转发到rvalue,对吧?我什至可以拥有constrvalue,那么为什么这是个坏主意或好主意?我在代码中的意思如下。"&&"rvalue引用允许用户使用临时值,并且仍然可以通过简单的转发使用lvalue。所以考虑到这一点,我为什么要提供c++11中任何函数的print_string(string&str)(lvalue引用)(const除外)>引用,因为rvalue没有问题)?#include#include#includeusingnamespacestd;void

c++ - 是否需要使用右值引用重复调用 move?

structBar{Bar(std::string&&val):m_Val(std::move(val)){}//ABar&operator=(Bar&&_other){m_Val=std::move(_other.m_Val);}std::stringm_Val;}structFoo{voidFunc1(Bar&¶m){Func2(std::move(param))//B}voidFunc2(Bar&¶m){m_Bar=std::move(param);//C}Barm_Bar;};voidmain(){Foof;std::strings="somestr";Barb