为什么它需要一个右值复制构造函数,即使它不会被调用?
Why it needs a rvalue copy constructor even it won't be called?
我写了一个shared_ptr class定义如下:
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");
}
但是没有语句打印出来。
我的环境是 visual studio 2019,使用 MSVC++。
如果我的右值拷贝构造函数没有执行,为什么在没有右值拷贝构造函数的情况下会出错? (我猜这是一个 RVO,但似乎不是)
谢谢大家的回答和评论,下次我会学着回答好问题的。
问题是您的复制构造函数出于某种原因接受非const
左值引用,它不能绑定到右值。只需将其设为 const:
shared_ptr(shared_ptr const& src) noexcept;
并且不需要移动构造函数。然而,无论如何实施移动 constructor/assignment 是个好主意,不要毫无意义地扰动参考计数器。
我写了一个shared_ptr class定义如下:
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");
}
但是没有语句打印出来。
我的环境是 visual studio 2019,使用 MSVC++。
如果我的右值拷贝构造函数没有执行,为什么在没有右值拷贝构造函数的情况下会出错? (我猜这是一个 RVO,但似乎不是)
谢谢大家的回答和评论,下次我会学着回答好问题的。
问题是您的复制构造函数出于某种原因接受非const
左值引用,它不能绑定到右值。只需将其设为 const:
shared_ptr(shared_ptr const& src) noexcept;
并且不需要移动构造函数。然而,无论如何实施移动 constructor/assignment 是个好主意,不要毫无意义地扰动参考计数器。