【发布时间】:2016-05-13 19:46:43
【问题描述】:
我正在使用转发构造函数制作一个瘦派生类。 (请耐心等待,我必须使用 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>&&)
【问题讨论】:
-
被 GCC 5+ 接受,被 4.9 和 Clang 拒绝。
-
至于为什么会出现这个错误:我认为这两种可能是
ConvertsToPtr的转换函数结果中的const shared_ptr<A>&构造函数,以及@987654326 @构造函数来自一个临时的shared_ptr<A>,它是从Args = {ConvertsToPtr}构造的。但我不确定这些是否同样好。 -
@Alf meh。 my_namespace::shared_ptr 和 std::shared_ptr 是不同的名称。
-
无法重现 with mingw g++ 5.1 and visual c++ 2015
-
我的猜测是编译器“认为”作为
ConvertsToPtrstruct 的对象不是由转换产生的 constshared_ptr<A>也是非常量的。当您将ConvertsToPtr()静态转换为const shared_ptr<A>&时,一切都可以正常编译。
标签: c++ c++11 implicit-conversion explicit