请考虑以下代码段:
#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++17的答案。
MyClass&& func() {
return MyClass{};
}
int main() {
MyClass&& myRef = func();
}
Run Code Online (Sandbox Code Playgroud)
问题:
func()x 值吗?为什么?myRef悬空引用?或者,更具体地说,为什么要func()返回悬空引用?返回右值引用不会导致临时物化并延长临时对象的生命周期吗?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++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 版本时,编译时不会发出警告。这是什么原因?