首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是与C++17中的临时值相同的prvalue。

是与C++17中的临时值相同的prvalue。
EN

Stack Overflow用户
提问于 2022-03-21 10:48:02
回答 1查看 276关注 0票数 3

我试图知道prvalue是否与C++17中的temporary相同。

代码语言:javascript
复制
//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,而我不明白它是如何可能的。

EN

回答 1

Stack Overflow用户

发布于 2022-03-21 11:41:53

,但这使我感到困惑,因为如果prvalue不是一个对象,那么它是什么?

可以成为对象的表达式。

,我的想法是,我们仍然有一个使用复制构造函数创建的prvalue,而prvalue是C++17中的一个临时值,因为它存在于有限的时间内。

prvalue还不是一个对象(或者这里有不同的想法)。

让我们通过使用func初始化一些东西来扩展您的示例。

代码语言:javascript
复制
int main() {
    auto obj = func();
}

objmain中,tempfunc中是“相同的对象”。就像如果func

代码语言:javascript
复制
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-constructorstemp的副本保留在返回值中:

代码语言:javascript
复制
void func(Custom * result) {
    Custom temp;
    new(result) Custom(temp);
}

在C++14到C++17之间的变化不是允许与抽象机器的行为不同,而是将抽象机器的定义更改为具有这种行为。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71556308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档