草庐IT

c++ - 多态 unique_ptr 复制省略

我有以下代码适用于Clang5.0,但不适用于启用了C++14的Clang3.8:classBase{};classDerived:publicBase{};std::unique_ptrMakeDerived(){autoderived=std::make_unique();returnderived;}intmain(){autobase=MakeDerived();std::coutLiveSampleHere在这种情况下,由于复制省略,返回值在技术上是移动构建的吗?如果是这样,这是否意味着unique_ptr的移动构造函数旨在支持用户类类型的隐式向上转换?从cppreferen

c++ - 复制构造函数省略?

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Whyhasthedestructorbeencalledonlyonce?鉴于下面的代码,我无法理解gcc中的输出。我希望创建和销毁两个对象,但只看到对构造函数和析构函数的一次调用。这里发生了什么?#include#includestructHuge{Huge(){std::cout这段代码在g++(4.4)中的输出是EnteringgConstructorExitinggBeforeleavingmainDestructor

c++ - 如何防止复制省略?

我有一个名为sfract的类,它存储指向二叉树根节点的指针。显然,当复制构造一个sfract时,我需要克隆另一个sfract对象的二叉树。但是,复制构造函数从未被调用,我认为是因为复制省略。这会导致两个sfract对象在解构时引用并尝试释放同一个根节点。我怎样才能防止这种情况发生?//main.cppsfract_typea(/*...*/);sfract_typeb(/*...*/);sfract_typec(a);//copyconstruct//sfract.htemplatesfract(sfractconst&other){//Cloneother'srootnodeanda

c++ - 省略 std::bind 中的 std::placeholders

要创建std::function,我是这样做的:-std::functionf=std::bind(&B::fb,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3);voidB::fb(intx,intk,intj){}//example很明显B::fb接收三个参数。为了提高可读性和可维护性,我希望我可以这样调用它:-std::functionf=std::bind(&B::fb,this);//omit_1_2_3问题C++中是否有任何功能可以省略占位符?它应该自动按顺序调用_1、_2、...

c++ - 复制构造函数省略?

不太明白为什么我用VC2010用debug模式构建时没有调用这个拷贝构造函数。classSomeClass{public:SomeClass(intmeaningless){}SomeClass(constSomeClass&sc){cout我认为这与RVO无关,因为我没有返回任何值。更有趣的是,当我将复制构造函数设为私有(private)时,即使省略了复制构造函数,编译器也不会编译。 最佳答案 这是编译器做的优化。根据语言规范,允许编译器尽可能忽略对复制构造函数的调用。仅语义检查需要一个可访问的复制构造函数,即使它实际上没有被调用

c++ - 是否允许复制/移动省略以使使用已删除函数的程序格式正确?

考虑以下代码:#includestructThing{Thing(void){std::cout我希望Thingthing{Thing{}};语句表示使用默认构造函数构造Thing类的临时对象并构造thingThing类的对象使用刚刚创建的临时对象作为参数的移动构造函数。我希望这个程序被认为是错误的,因为它包含对已删除移动构造函数的调用,即使它可能被省略。标准的class.copy.elision部分似乎也要求这样做:theselectedconstructormustbeaccessibleevenifthecalliselidedWordingforguaranteedcopyel

c++ - 嵌入式 C++ : Initialization of an array member of a struct within a class, 大小省略

您好,在此先感谢您对以下问题的任何帮助。编辑:我忘了补充一点,这是在无法访问STL功能的嵌入式系统上。我很抱歉遗漏了这条非常重要的信息。这是我第一次广泛使用C++进行编码,所以我忘了提及显而易见的事情。我回来补充这个事实,这个问题已经收到了一些回复。感谢大家这么快的回复!我正在尝试初始化结构的数组成员,该结构又是C++类的公共(public)成员。结构中省略了数组大小。这是一个例子://ClassA.hClassA{public:structStructA{StructBstructs[];};structStructB{//stuff};ClassA();//etc};//Class

c++ - return 语句中可以省略 return 关键字吗?

我最近在这个ApacheAxistutorialexample.中看到了下面的一段代码intmain(){intstatus=AXIS2_SUCCESS;axutil_env_t*env=NULL;axutil_allocator_t*allocator=NULL;env=create_environment();status=build_and_serialize_om(env);(status==AXIS2_FAILURE){printf("buildAXIOMfailed");}axutil_env_free(env);0;}我不明白的是最后的0;。那个return语句没有ret

c++ - 复制省略和右值引用

在下面的代码中,用什么来避免复制、省略或右值引用以及移动构造函数?std::stringget(){return"...";}voidfoo(std::stringvar){}foo(get());// 最佳答案 std::stringget(){//thisissimilartoreturnstd::string("..."),whichis//copied/movedintothereturnvalueobject.return"...";}RVO允许它把临时字符串对象直接构造成get()的返回值对象。foo(get());RV

c++ - 如何检查 C++ 复制省略

我在copyellision上看到这篇文章在C++中,我在boost库中看到了关于它的评论。这很吸引人,因为我更喜欢我的函数看起来像verylargereturntypeDoSomething(...)而不是voidDoSomething(...,verylargereturntype&retval)所以,我有两个问题Google几乎没有这方面的文档,这有多真实?如何检查此优化是否实际发生?我假设它涉及查看程序集,但可以说这不是我的强项。如果有人能给出一个非常基本的例子来说明成功的省略是什么样子,那将非常有用我不会仅仅为了美化事物而使用复制省略,但如果我能保证它有效,那么它听起来非常有