草庐IT

c++ - 复制省略和异常(exception)

在阅读了cppreference的复制省略之后我想玩异常(exception)和复制省略。所以我在coliru上用gcc7.2写了下面的代码#includeclassException{public:Exception(){std::cout输出constructedcopyconstructed我们可以看到调用了复制构造函数,即使在使用-O2调用gcc时也会发生这种情况。在我看来,根据以下条款,这段代码应该有资格复制省略:Whenhandlinganexception,iftheargumentofthecatchclauseisofthesametype(ignoringtop-l

c++ - 编译器省略外循环

我已经在C++项目中实现(阅读:从wiki复制粘贴)XXTEA密码。为清楚起见,我将加密和解密分开在不同的函数中:(注意:这不是密码学问题!请不要对所选密码发表评论)#defineDELTA0x9e3779b9#defineMX(((z>>5^y>3^z>2)&3;for(p=0;p>2)&3;for(p=n-1;p>0;p--){z=v[p-1];y=v[p]-=MX;}z=v[n-1];y=v[0]-=MX;}while((sum-=DELTA)!=0);}#undefMX#undefDELTA当此代码在Debug中编译时,它可以完美运行。但是,当我使用VisualStudio20

c++ - 保证复制省略纸在构造函数中使用 void

在paperP0135R0有一个例子:structNonMoveable{NonMoveable(int);NonMoveable(NonMoveable&)=delete;voidNonMoveable(NonMoveable&)=delete;std::arrayarr;};NonMoveablemake(){returnNonMoveable(42);//ok,directlyconstructsreturnedobject}autonm=make();//ok,directlyconstructs'nm'这让我很困惑:voidNonMoveable(NonMoveable&)=

c++ - 保证复制省略是否适用于函数参数?

如果我理解正确的话,从C++17开始,这段代码现在要求不进行复制:Foomyfunc(void){returnFoo();}autofoo=myfunc();//nocopy函数参数也是如此吗?以下代码中是否会优化拷贝?Foomyfunc(Foofoo){returnfoo;}autofoo=myfunc(Foo());//willtherebecopies? 最佳答案 在C++17中,纯右值(“匿名临时对象”)不再是对象。相反,它们是关于如何构造对象的说明。他们可以根据构造指令实例化一个临时对象,但是由于那里没有对象,因此没有复制

c++ - 可以复制省略/RVO 导致从同一对象复制/移动

假设我有一个如下所示的函数:SomeObjectcopy_maybe(boolmake_new,constSomeObject&def){if(make_new)returnSomeObject();elsereturndef;}我这样调用它:SomeObjectobj;obj=copy_maybe(true,obj);如果没有复制省略,这显然总是会从copy_maybe中创建的临时文件复制到obj。但是,使用复制省略/RVO,复制是否有可能发生从obj到obj?更具体地说,在这些(或类似)条件下,是否有可能在复制运算符(voidoperator=(SomeObjectconst&ot

c++ - gcc 和 clang 都省略了下面代码段中对移动构造函数的调用。这个对吗?

在下面的代码中,类S的对象s用于通过直接初始化来初始化类D的对象>Dd(s);。转换函数S::operatorD()用于将对象s转换为D类型的临时对象。然后,gcc和clang都省略了对移动构造函数D(&&)的显式调用,以将此临时对象移动到d中。参见liveexample.#includestructD;structS{operatorD();};structD{D(){}D(D&&){std::cout我基于以下理由质疑这种省略的正确性:这种情况包含在§8.5/16(N3337)的第一个子项目符号点中,其中没有提及省略。Iftheinitializationisdirect-init

参数列表中带有省略号的 C++ Lambda

我正在开发一个使用lambda来描述表达式术语范围的库。因为库必须分发唯一的整数来标识每个变量,所以理想的情况是库而不是用户构造变量并且用户代码将它们作为lambda参数接收。(换句话说,我正在从miniKanren实现“call\fresh”的C++模拟。)由于用户可能想在特定范围内引入从零到许多新变量的任何数字,我希望用户能够将具有不同数量参数的lambda传递给库。但是,我不知道有任何(简单的)方法(在C++14中)可以推断出任意lambda对象的参数数量。我突然想到为什么不将固定数量(比如10个)的变量ID参数传递给lambda,并让用户代码在lambda中使用省略号来忽略不需

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++ - 保证复制省略世界中的构造函数实例化

考虑这个例子:templateusingtype=typenameT::type;templatestructA{A(type);};Af();Ag(){returnf();}由于int没有嵌套的typetypedef,gcc和clang都无法编译此代码。但是为什么要实例化该构造函数呢?f()是与g()的返回相同类型的纯右值,那里甚至不应该移动。是什么导致我们实例化错误的构造函数? 最佳答案 构造函数有点像转移注意力。如果它是任何其他成员函数,也会发生同样的情况。templatestructA{voidfoo(type);//Sam

c++ - std::array<std::vector> 中的大括号省略

我正在为C++17使用g++进行编译。我有以下内容:std::array,2>v={{{1,2},{3,4}}};我不明白为什么如果我删除数组的双括号它就不再起作用了。std::array,2>v={{1,2},{3,4}};//Doesnotcompile我了解std::array的工作原理以及通常需要双大括号,但在为C++17进行编译时,我希望大括号省略发挥作用。为什么大括号省略在这里不适用? 最佳答案 std::array,2>是有效的structarray{std::vectorelems[2];};elems是一个子聚合就