- 主题:return unique_ptr
同意
【 在 allegro 的大作中提到: 】
: 这是RVO,不是move。欢迎批判。
--
FROM 98.42.143.*
我已经糊涂了,最后那个s是赋值,还是构造函数还是别的?
【 在 here080 的大作中提到: 】
: 确实会RVO,甚至有可能是保证的RVO
: 但是程序正确性仍然是靠一个形式上的move
: 这么说,你可以试着定义一个不能copy不能move的类,然后让一个函数的返回值是它,看看能不能编译。
: ...................
--
FROM 98.42.143.*
所呢?
楼主给出的例子1是因为它是构造函数constructor,还是属于拷贝构造copy constructor?我觉得反正不是赋值操作copy assignment operator。
应该是一种RVO,但是,和move有关系吗?
【 在 here080 的大作中提到: 】
: 赋值和构造一般是同时定义的。他们的作用是一体的。
: 这里因为你返回的对象是一个新对象,当然应该是构造。
:
--
修改:bihai FROM 98.42.143.*
FROM 98.42.143.*
我定义了一个没有赋值构造和拷贝赋值,没有move的类,仍然可以通过楼主的1.我用的是C++17
也就是说,楼主的1,是完全的RVO,没有经过复制,赋值,移动。只是构造。所以可以。
【 在 here080 的大作中提到: 】
: 赋值和构造是一体的……
: copy系的
: T& operator=(const T&);
: ...................
--
FROM 98.42.143.*
我定义了一个没有赋值构造和拷贝赋值,没有move的类,仍然可以通过楼主的1.我用的是C++17
也就是说,楼主的1,是完全的RVO,没有经过复制,赋值,移动。只是构造。所以可以。
【 在 here080 的大作中提到: 】
: 赋值和构造是一体的……
: copy系的
: T& operator=(const T&);
: ...................
--
FROM 98.42.143.*
C++17
#include <stdio.h>
#include <memory>
class OK {
public:
int value;
OK(int x):value(x){
printf("Constructor:%d\n",value);
}
OK(const OK&) = delete;
OK& operator= (const OK&) = delete;
OK(OK&&) = delete;
OK& operator=(OK&&) = delete;
void doit() {
printf("Hello World:%d", value);
}
};
OK Get() {
return OK(5);
}
int main()
{
OK x(3), z(1);
// OK y(x); // No Copy constructor
// OK w(std::move(z)); // No move constructor
// x=Get(); // No assignment. If move is available, it will compile
// x = std::move(z); // No move assignment
OK y=Get();
y.doit(); // RVO without copy, assignment, move, move assignment
return 0;
}
【 在 here080 的大作中提到: 】
: 啥也不用说了,上代码吧
:
--
FROM 98.42.143.*
对,但你这不是楼主的问题。
【 在 foliver 的大作中提到: 】
: 按照C++参考手册,返回纯右值,用纯右值初始化这两种情况不要用copy move构造函数。
: 其余其他情况依然需要copy move构造,但是不会调用。比如你的get函数写成
: a =ok(5)
: ...................
--
FROM 98.42.143.*
你编译的时候,要选择C++17,因为C++14还是要求Copy constructor或者Move constructor的,虽然最后并不调用。C++17开始完全不需要这些了。
【 在 foliver 的大作中提到: 】
: 就我个人理解,unique ptr是无法做rvo优化的,等我哪天看看我编译后代码。
--
FROM 98.42.143.*
是的,这个问题延伸一下就很复杂了,比如变成赋值(不是楼主原来的那个拷贝构造的形式),还有C++17,都不一样。所以我得一样一样学。所以没有跟得上大家的讨论。
【 在 here080 的大作中提到: 】
: 你说的对,guaranteed RVO可以不需要move
: 不过之前我们都在讨论返回左值,没注意你还在说楼主的问题。
:
--
FROM 98.42.143.*