草庐IT

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上找到一个

c++ - 临时绑定(bind)到左值引用

我有以下代码stringthree(){return"three";}voidmutate(string&ref){}intmain(){mutate(three());return0;}你可以看到我正在将three()传递给mutate方法。这段代码编译得很好。我的理解是,不能将临时对象分配给非常量引用。如果是,这个程序是如何编译的?有什么想法吗?编辑:尝试过的编译器:VS2008和VS2010Beta 最佳答案 它曾经在VC6编译器中编译,所以我想为了保持向后兼容性VS2008支持这个非标准扩展。试试/Za(禁用语言扩展)标志,

c++ - 为什么不调用复制构造函数将临时对象复制到新定义的对象

#includeusingnamespacestd;classY{public:Y(int){cout输出:Y(int)预期输出:Y(int)Y(常量Y&)问题>根据我的理解,第1行会先创建一个临时对象Y(2),然后将临时对象赋值给obj1。因此,我希望Y(int)和Y(constY&)都被调用。但是vs2010的输出只报告第一个(即Y(int))。为什么? 最佳答案 Why?因为在某些情况下(由C++11标准的第12.8/31段指定)可以省略对复制构造函数或移动构造函数的调用,即使这些特殊函数(或析构函数)具有副作用:Thisel

c++ - 在 C++ 中将临时变量作为非常量引用传递

我有以下一段代码,作为示例,dec_proxy尝试反转增量运算符对在复杂函数调用foo中执行的类型的影响-顺便说一句,我无法更改其接口(interface)。#includetemplateclassdec_proxy{public:dec_proxy(T&t):t_(t){}dec_proxy&operator++(){--t_;return*this;}private:T&t_;};templatevoidfoo(T&t,S&s,R&r){++t;++s;++r;}intmain(){inti=0;doublej=0;shortk=0;dec_proxydp1(i);dec_pro