【发布时间】:2021-11-01 19:25:39
【问题描述】:
我写了一个shared_ptr,类定义如下:
template <typename T>
class shared_ptr {
private:
...
public:
shared_ptr(T* p);
shared_ptr(shared_ptr& src);
shared_ptr& operator=(shared_ptr const& src);
};
shared_ptr<T> make_shared(Args&&... args) {
return shared_ptr<T>(new T(std::forward<Args>(args)...));
}
// the function call:
shared_ptr<int> a = make_shared<int>(1);
它不起作用,编译器错误地告诉我
non-const lvalue reference to type shared_ptr<> cannot bind to rvalue of type shared_ptr<>
我添加了一个右值复制构造函数:
template <typename T>
shared_ptr(shared_ptr&& src) {
print("rvalue");
}
但没有打印出来。
我的环境是带有 MSVC++ 的 Visual Studio 2019。
如果我的右值拷贝构造函数没有被执行,为什么没有右值拷贝构造函数时会出错? (我猜它是 RVO 但似乎不是)
谢谢大家的回答和评论,下次我会学着回答好问题的。
【问题讨论】:
-
@Enlico 确实很长,但我们不鼓励用户调试他们的代码吗?
-
RVO 部分可能与c++ - Why is a public copy constructor required even if it is not invoked? - Stack Overflow 重复,但我不确定复制/移动是否有显着差异。
-
@user202729,我们也应该鼓励“调试”散文。
-
@JunzhongPan - 不要道歉。虽然您的帖子本来可以更专注,但它的提出方式是不可原谅的。
-
@DaveNewton,下次我会温柔一点。
标签: c++ c++11 rvalue lvalue make-shared