标签: xvalue

为什么临时生命周期扩展会导致多次调用析构函数?

请考虑以下代码段:

#include <iostream>

using namespace std;

class Temp {
    public:
    Temp() { cout << "Temp()" << endl;}
    ~Temp() { cout << "~Temp()" << endl;}
};

Temp GetTemp() {
     cout << "GetTemp" << endl;
    return Temp();
}

Temp TakeTemp(Temp temp) {
    cout << "TakeTemp" << endl;
    return temp;
}


int main()
{
    TakeTemp(GetTemp());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我跑TakeTemp(GetTemp());,输出看起来像

GetTemp                                                                                                                                                        
Temp()                                                                                                                                                         
TakeTemp                                                                                                                                                       
~Temp()                                                                                                                                                        
~Temp()     
Run Code Online (Sandbox Code Playgroud)

注意,~Temp()这里调用两次(但只构造了1个temp obj).这似乎很奇怪,因为1)返回的临时变量GetTemp()应该将其生命周期扩展到完整表达式,并且2)因为我们temp直接TakeTemp返回,返回值optmization将重用相同的对象.

任何人都可以解释为什么这里有多个dstor调用?

(注意,如果我们放置更多层的TakeTemp(),dstor调用的数量会按比例增长.)

c++ temporary lifetime xvalue c++11

3
推荐指数
1
解决办法
81
查看次数

返回右值引用和临时物化

考虑以下函数。我想要C++17的答案。

MyClass&& func() {
  return MyClass{};
}

int main() {
  MyClass&& myRef = func();
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 表达式是func()x 值吗?为什么?
  2. 为什么是myRef悬空引用?或者,更具体地说,为什么要func()返回悬空引用?返回右值引用不会导致临时物化并延长临时对象的生命周期吗?

c++ return rvalue-reference xvalue c++17

3
推荐指数
1
解决办法
275
查看次数

C++ 11:"decltype(1 + 2)"声明xvalue还是prvalue?

decltype(1 + 2)是否声明了xvalue或prvalue?

cppreference说,decltype(表达式)将声明:1.T && if表达式是否是xvalue 2.如果表达式是prvalue 3. T&if表达式是lvalue

但我的问题是:如何生成一个xvalue的表达式?我想返回值和临时对象应该是xvalue,但实际上它们似乎是xvalue,在我的实验中:

struct S{};
S f();
int main()
{
    int i=2;
    decltype(i+1) j=i;
    ++j;
    printf("i=%d\n",i);
    S obj;
    decltype(f()) k=obj;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个程序编译:我可以判断

decltype(i + 1)将(i + 1)声明为prvalue

因为如果它是一个xvalue,那么decltype得到T &&,它不能绑定到左值变量"i".decltype(f())也给我f()作为prvalue也很奇怪?

所以我的问题是:如何写一个表达式,以便decltype(表达式)给我一个xvalue?谢谢.

c++ decltype xvalue c++11 prvalue

2
推荐指数
1
解决办法
132
查看次数

为什么 C++ 允许返回 ifstream 对象?

在 C++98 中,以下代码无法编译,因为 ifstream 没有复制构造函数:

#include <iostream>
#include <fstream>
using namespace std;

ifstream f() {
    return ifstream("main.cpp");
}

int main() {
    ifstream st= f();
}
Run Code Online (Sandbox Code Playgroud)

但是,在 C++11 中使用多个 GCC 版本时,编译时不会发出警告。这是什么原因?

c++ fstream xvalue c++11

1
推荐指数
1
解决办法
77
查看次数