如果一个类有标准构造函数和拷贝构造函数classEx{//constructordefinitions}和一个将它作为参数(按值)的函数voidF(Ex_exin){...}采用以下代码:ExA;F(A);//F'sparameteriscopyconstructedfromAF(Ex());//F'sparameterusesthedefaultconstructor在第三行中,我使用默认构造函数将Ex类的新(临时)对象传递给F。我的问题是:在创建这个新对象之后,它是否也复制构造/分配(就像它发生在第二行中一样)还是直接在F“内部”创建? 最佳答案
代码如下:#includeintmain(){vectorv1(5,1);v1.swap(vector());//trytoswapv1withatemporaryvectorobject}上面的代码无法编译,错误:error:nomatchingfunctionforcallto‘std::vector>::swap(std::vector>)’但是,如果我将代码改成这样,它可以编译:intmain(){vectorv1(5,1);vector().swap(v1);}为什么? 最佳答案 因为vector()是一个rvalue(暂
考虑这个最小的例子templateclassFoo{public:Foo(constT&t_):t(t_){}Foo(T&&t_):t(std::move(t_)){}Tt;};templateFoomakeFoo(F&&f){returnFoo(std::forward(f));}intmain(){classC{};Cc;makeFoo(c);}MSVC2017失败并出现Foo构造函数的重新定义错误。显然T被推断为C&而不是预期的C。这究竟是如何发生的以及如何修改代码以使其执行预期的操作:从const引用复制构造Foo::t或从r-移动构造它值(value)。
#include#include#includeinti=0;structA{A():j(++i){std::coutvec;voidfoo(vec&v){v.push_back(std::move(A()));}intmain(){vecv;foo(v);foo(v);}上面的例子产生下一个输出:constructor1move1destructor1constructor2move2move1destructor1destructor2destructor1destructor2问题:为什么执行了第一个析构函数(但没有为第二个对象执行)?为什么第二个对象的移动在第一个对象的移动之前
我有以下测试程序:#include#include#includetemplatevoidfoo(Ty(&&)[N]){std::cout::valuevoidfoo(Ty(&)[N]){std::cout::valueusingid=Ty;intmain(){std::cout.setf(std::cout.boolalpha);foo(id{1,2,3,4,5});foo(id{1,2,3,4,5});//我希望标有箭头的行会调用右值重载,就像它上面的非常量调用一样,但事实并非如此。这只是GCC中的一个错误,还是标准中有什么东西导致选择左值重载? 最佳答
取消引用临时std::shared_ptr是否安全?例子:std::shared_ptrcreate_shared_string(){returnstd::shared_ptr(newstd::string("hello"));}std::cout我担心的是,一旦取消引用完成,shared_ptr就会被销毁并且引用计数器会变为零,因此返回的原始指针不再安全。 最佳答案 whatisthelifetimeofC++temporaryobject在这种情况下,返回的std::shared_ptr直到std::cout才会被销毁已完成,因
考虑以下代码片段:#includestructS{~S(){std::coutOutput:2dtor即对象生命周期通过引用扩展,这在Herb的article中有解释。.但是,如果我们只更改一行代码并写成:constS&s=S().f(1);对已销毁的对象调用f(2):Output:1dtor2为什么会这样?f()的返回值不是正确的“时间性”类型吗? 最佳答案 当你这样写一个函数时......constS&f(inti)const{std::cout...您指示编译器返回constS&并且您负责确保引用的对象具有适合调用者使用的生命
我正在尝试从流中读取单个字符。使用以下代码,我得到一个“模糊重载”编译器错误(GCC4.3.2,and4.3.4)。我做错了什么?#include#includeintmain(){charc;std::istringstream("a")>>c;return0;}备注:VisualStudio2008编译无误其他类型(int、double)都可以用如果我首先创建一个变量std::istringstreamiss("a");iss>>c,编译器没有报错 最佳答案 字符的提取操作符>>>是一个非成员函数模板:templatebasic
此代码编译并执行。我知道在第一种情况下我们有未定义的行为。但是在第二种情况下到底发生了什么?#include#include#includestd::stringfoo(){return"HELLO";}voidbar(constchar*p){std::printf("%s\n",p);}intmain(){//FIRSTCASE://Iknowthisisbad,becauseaftertheassignment//thevariablereturnedbyfoo()isdestroyedandwe//haveabadreference.conststd::string&s=foo
是否可以限制类实例仅用作右值(例如临时值)?例如,我有一个Wrapper类,其构造函数采用Aconst&并将此引用保存在其成员中。这很危险,因为Wrapper实例的生命周期不能长于A实例的生命周期,但如果Wrapper是temporary. 最佳答案 我认为即使想要这样做也是设计非常糟糕的标志。但是,您可以将所有构造函数设为私有(private),并创建一个返回右值的友元函数。这应该可以解决问题。 关于c++-是否可以限制类实例仅用作临时实例?,我们在StackOverflow上找到一个