我试图知道prvalue是否与C++17中的temporary相同。
//C++17 example
#include <iostream>
struct Custom
{
Custom()
{
std::cout<<"default constructor called"<<std::endl;
}
Custom(const Custom& var)
{
std::cout<<"copy constructor called"<<std::endl;
}
~Custom()
{
std::cout<<"destructor called"<<std::endl;
}
};
Custom func()
{
Custom temp;
return temp;//this will use copy constructor
}
int main() {
func();
}假设以上代码是在启用-fno-elide-constructors选项的情况下执行的,我的问题是,作为函数func中名为temp的本地对象副本创建的prvalue是否与C++17中的临时值相同。
我在C++17中读到,prvalue不是一个对象。例如,here用户说
“Prvalue不是对象(自C++17)”。
类似地,here用户说
“在C++17之前,prvalue已经是临时的,这就是您引用的内容。
但这让我感到困惑,因为如果prvalue不是一个对象,那么它是什么?我的意思是,在上面的示例中,使用复制构造函数创建了temp的副本。现在,在C++17之前,该副本是一个临时对象,它是一个prvalue。我的想法是,我们仍然有一个使用复制构造函数创建的prvalue,而prvalue是C++17中的一个临时值,因为它存在于有限的时间内。
PS:我描述实际发生的事情可能是错误的,所以请解释一下在C++17中发生了什么,以及它与C++14有什么不同。我还问,因为我在so帖子(类似的帖子)上看到过,在上面的例子中,没有临时涉及到的C++17,而我不明白它是如何可能的。
发布于 2022-03-21 11:41:53
,但这使我感到困惑,因为如果prvalue不是一个对象,那么它是什么?
可以成为对象的表达式。
,我的想法是,我们仍然有一个使用复制构造函数创建的prvalue,而prvalue是C++17中的一个临时值,因为它存在于有限的时间内。
prvalue还不是一个对象(或者这里有不同的想法)。
让我们通过使用func初始化一些东西来扩展您的示例。
int main() {
auto obj = func();
}obj在main中,temp在func中是“相同的对象”。就像如果func是
void func(Custom * result) {
Custom & temp = *new(result) Custom;
}
int main() {
char storage[sizeof(Custom)];
Custom & obj = *reinterpret_cast<Custom *>(storage);
func(&obj);
obj.~Custom();
}或者-fno-elide-constructors将temp的副本保留在返回值中:
void func(Custom * result) {
Custom temp;
new(result) Custom(temp);
}在C++14到C++17之间的变化不是允许与抽象机器的行为不同,而是将抽象机器的定义更改为具有这种行为。
https://stackoverflow.com/questions/71556308
复制相似问题