草庐IT

c++ - 防止临时对象的引用传递

我有一个“记住”对某个对象(例如整数变量)的引用的类。我不能让它引用一个立即销毁的值,我正在寻找一种方法来保护我的类(class)的用户免于意外这样做。右值引用重载是防止传入临时值的好方法吗?structHasRef{int&a;HasRef(int&a):a(a){}voidfoo(){a=1;}};intmain(){intx=5;HasRefr1(x);r1.foo();//workslikeintended.HasRefr2(x+4);r2.foo();//dereferencesthetemporarycreatedbyx+4}私有(private)右值重载可以吗?struc

c++ - 返回临时人员的复制省略

我试图了解C++17标准保证的生命周期,特别是保证复制省略。让我们从一个例子开始std::stringmake_tmp();std::stringfoo(){returnstd::string{make_tmp().c_str()};}我对正在发生的事情的理解:make_tmp创建一个临时的string我们将调用t;foo返回一个(不必要创建的)临时(t的c_str的拷贝)。标准(甚至是C++17之前的版本)保证t的生命周期是计算完整返回表达式之前的时间。因此,创建t的临时拷贝(将被返回)是安全的。现在copyelisions开始;更具体地说,第一个C++17block中的第二个项目符

c++ - 在 C++ 标准中临时绑定(bind)到成员生命周期语句有什么意义?

在thisquestion用户HappyMittal引用C++03标准第12.2.5节:在构造函数的ctor-initializer(12.6.2)中临时绑定(bind)到引用成员,直到构造函数退出。无论如何,这有什么用?我的意思是,一旦构造函数退出,临时对象就会被销毁,但引用仍然绑定(bind)-现在绑定(bind)到一个已经被销毁的对象。如果外部对象的整个生命周期仍然存在悬空引用,那么如此仔细地指定临时生命周期有什么意义呢?这种行为在什么情况下有用? 最佳答案 将引用成员绑定(bind)到死对象没有用,但明确绑定(bind)到引

c++ - 使用临时数组作为左值

这个程序是错误的:structX{inti;};intmain(){(X{}).i=1;}i,临时X{}的子对象,不能用作左值,因为X{}是右值.但是,这会使用GCC5.2.1和-Wall进行静默编译:usingY=int[10];intmain(){(Y{})[0]=1;}如果编译器是正确的,那么这一次,(Y{})的第零个元素,它是(Y{})的子对象,可以是被视为左值。我的问题是:第二个程序格式错误吗?为什么(不是),尽管这两个程序似乎都将临时对象的子对象视为左值? 最佳答案 如果我正在阅读defectreport1213,我相信

c++ - 使用 boost::optional 时避免临时

boost::optional支持像这样的in_place构造:#include#includeclassFoo{inta,b;public:Foo(intone,inttwo):a(one),b(two){}};intmain(){boost::optionalfooOpt(boost::in_place(1,3));}一旦我们有了一个初始化的fooOpt,有没有办法在不创建临时对象的情况下为它分配一个新的Foo?类似的东西:fooOpt=boost::in_place(1,3);谢谢! 最佳答案 boost::可选#includ

c++ - 函数调用中临时构造被解释为声明

最近我遇到了一个问题,它以某种方式(但仅以某种方式)对我有意义。它基于将临时构造解释为单个(!)构造函数参数的声明。请查看下面的最小示例。#includeclassFoo0{public:Foo0(inta){};voiddoStuff(){std::cout我已经读过这样的表达:Foo(a);被解释(如果有标准构造函数)作为a的声明。这是有道理的,而且完全没问题,因为您可以只使用{}括号使构造显式化。但我不明白的是:为什么bar0的构建有问题?所有Foo都没有标准的构造函数。因此,将Foo0(x)之类的内容解释为x的声明是没有意义的。为什么bar1和bar2的构造有效?对我来说很明显

c++ - 为什么从 lambda 返回 const 引用会导致临时引用?

我有一个情况,我有一个成员返回一个const&,然后这个结果在一个具有相同返回类型的lambda中转发。MSVC2017将这种情况识别为有风险,并发出警告:returningaddressoflocalvariableortemporary。使用clang和其他编译器进行的实证测试表明这是全面的。我不明白的是,为什么这与几个返回相同类型的方法调用不同。例如,这非常有效:classA{public:conststd::string&name()const{returnm_name;}private:std::stringm_name;};classB{public:conststd::s

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)。