gpt4 book ai didi

c++ - 正确命名的临时对象和右值引用/移动

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:56 25 4
gpt4 key购买 nike

在 C++11 之前,作为一种标准的编程习惯,临时变量通常被分配给变量以使代码更清晰。对于小型类型,通常会制作一个拷贝,对于较大的类型,可能会制作一个引用,例如:

int a = int_func();
T const & obj = obj_func();
some_func( a, obj );

现在,将其与内联表单进行比较:

some_func( int_func(), obj_func() );

在 C++11 之前,这具有几乎相同的语义。随着右值引用和移动语义的引入,上面的内容现在完全不同了。特别是,通过强制 obj 键入 T const &,您已经删除了使用移动构造函数的能力,而内联形式的类型可以是 T&& 代替。

鉴于第一个是通用范例,标准中是否有任何内容允许优化器在第一种情况下使用移动构造函数?也就是说,编译器能否以某种方式忽略对 T const & 的绑定(bind),而是将其视为 T&&,或者,正如我怀疑的那样,这是否违反了抽象机?

问题的第二部分,要在 C++11 中正确地做到这一点(不消除命名的临时对象),我们需要以某种方式声明一个正确的右值引用。我们还可以使用 auto 关键字。那么,执行此操作的正确 方法是什么?我的猜测是:

auto&& obj = obj_func();

最佳答案

第 1 部分:

编译器不允许隐式转换obj转换为非常量右值,因此在调用 some_func 时使用移动构造函数.

第 2 部分:

auto&& obj = obj_func();

这将创建对临时对象的非常量引用,但在调用 some_func 时不会隐式移动它因为obj是一个左值。要将其转换为右值,您应该使用 std::move在调用站点:

some_func( a, std::move(obj) );

关于c++ - 正确命名的临时对象和右值引用/移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7648979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com