我正在制作一个具有转发构造函数的继承类。(请容忍我,我必须使用缺乏继承构造函数的GCC 4.7.2)。
第一次尝试时,我忘记添加explicit
关键字并出现了错误。有人能够解释一下为什么会出现这个特定的错误吗?我很难理解事件的顺序。
#include <memory>
template<typename T>
struct shared_ptr : std::shared_ptr<T>
{
template<typename...Args>
/*explicit*/ shared_ptr(Args &&... args)
: std::shared_ptr<T>(std::forward<Args>(args)...)
{}
};
struct A {};
struct ConvertsToPtr
{
shared_ptr<A> ptr = shared_ptr<A>(new A());
operator shared_ptr<A> const &() const { return ptr; }
};
int main()
{
shared_ptr<A> ptr;
ptr = ConvertsToPtr(); // error here
return 0;
}
错误:
test.cpp: In function ‘int main()’:
test.cpp:28:23: error: ambiguous overload for ‘operator=’ in ‘ptr = ConvertsToPtr()’
test.cpp:28:23: note: candidates are:
test.cpp:9:8: note: shared_ptr<A>& shared_ptr<A>::operator=(const shared_ptr<A>&)
test.cpp:9:8: note: shared_ptr<A>& shared_ptr<A>::operator=(shared_ptr<A>&&)
ConvertsToPtr
的转换函数的结果中使用const shared_ptr<A>&
构造函数,另一种是从临时shared_ptr<A>
构造的shared_ptr<A>&&
构造函数,其参数为Args = {ConvertsToPtr}
。但我不确定它们是否同样有效。 - Kerrek SBConvertsToPtr
是一个右值是否会改变从shared_ptr<A> const &
到shared_ptr<A> &&
的转换。但我不知道是否存在这样的规则。也许这是GCC 4.x中的一个错误。 - AndyJostconst
。 - T.C.