草庐IT

临时表

全部标签

c++ - 按值传递临时对象作为参数 - 是否调用复制构造函数?

如果一个类有标准构造函数和拷贝构造函数classEx{//constructordefinitions}和一个将它作为参数(按值)的函数voidF(Ex_exin){...}采用以下代码:ExA;F(A);//F'sparameteriscopyconstructedfromAF(Ex());//F'sparameterusesthedefaultconstructor在第三行中,我使用默认构造函数将Ex类的新(临时)对象传递给F。我的问题是:在创建这个新对象之后,它是否也复制构造/分配(就像它发生在第二行中一样)还是直接在F“内部”创建? 最佳答案

c++ - vector<T>::swap 和临时对象

代码如下:#includeintmain(){vectorv1(5,1);v1.swap(vector());//trytoswapv1withatemporaryvectorobject}上面的代码无法编译,错误:error:nomatchingfunctionforcallto‘std::vector>::swap(std::vector>)’但是,如果我将代码改成这样,它可以编译:intmain(){vectorv1(5,1);vector().swap(v1);}为什么? 最佳答案 因为vector()是一个rvalue(暂

c++ - 如何通过转发模板从 const 引用或临时对象构造对象

考虑这个最小的例子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)。

c++ - 将临时对象移动到 vector 中

#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问题:为什么执行了第一个析构函数(但没有为第二个对象执行)?为什么第二个对象的移动在第一个对象的移动之前

c++ - 临时 const 数组未绑定(bind)到右值引用

我有以下测试程序:#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中的一个错误,还是标准中有什么东西导致选择左值重载? 最佳答

c++ - 取消引用临时 std::shared_ptr 是否安全?

取消引用临时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才会被销毁已完成,因

c++ - 与 const 引用关联的临时对象的生命周期(方法链接)

考虑以下代码片段:#includestructS{~S(){std::coutOutput:2dtor即对象生命周期通过引用扩展,这在Herb的article中有解释。.但是,如果我们只更改一行代码并写成:constS&s=S().f(1);对已销毁的对象调用f(2):Output:1dtor2为什么会这样?f()的返回值不是正确的“时间性”类型吗? 最佳答案 当你这样写一个函数时......constS&f(inti)const{std::cout...您指示编译器返回constS&并且您负责确保引用的对象具有适合调用者使用的生命

c++ - 从临时流中提取字符时出现 GCC 编译器错误

我正在尝试从流中读取单个字符。使用以下代码,我得到一个“模糊重载”编译器错误(GCC4.3.2,and4.3.4)。我做错了什么?#include#includeintmain(){charc;std::istringstream("a")>>c;return0;}备注:VisualStudio2008编译无误其他类型(int、double)都可以用如果我首先创建一个变量std::istringstreamiss("a");iss>>c,编译器没有报错 最佳答案 字符的提取操作符>>>是一个非成员函数模板:templatebasic

c++ - 函数调用中临时对象的销毁究竟发生在什么时候?

此代码编译并执行。我知道在第一种情况下我们有未定义的行为。但是在第二种情况下到底发生了什么?#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

c++ - 是否可以限制类实例仅用作临时实例?

是否可以限制类实例仅用作右值(例如临时值)?例如,我有一个Wrapper类,其构造函数采用Aconst&并将此引用保存在其成员中。这很危险,因为Wrapper实例的生命周期不能长于A实例的生命周期,但如果Wrapper是temporary. 最佳答案 我认为即使想要这样做也是设计非常糟糕的标志。但是,您可以将所有构造函数设为私有(private),并创建一个返回右值的友元函数。这应该可以解决问题。 关于c++-是否可以限制类实例仅用作临时实例?,我们在StackOverflow上找到一个