当我向派生类添加析构函数时,当它尝试使用复制 ctor 而不是定义的移动 ctor 时,会出现编译器错误(使用 gcc 4.7):
#include <utility>
#include <iostream>
template <typename T>
struct Base
{
T value;
Base(T&& value) :
value(value)
{
std::cout << "base ctor" << std::endl;
}
Base& operator=(const Base&) = delete;
Base(const Base&) = delete;
Base& operator=(Base&& rhs)
{
value = rhs.value;
std::cout << "move assignment" << std::endl;
}
Base(Base&& other) :
value(other.value)
{
std::cout << "move ctor" << std::endl;
}
virtual ~Base()
{
std::cout << "base dtor" << std::endl;
}
};
template <typename T>
struct Derived : public Base<T>
{
Derived(T&& value) :
Base<T>(std::forward<T>(value))
{
std::cout << "derived ctor" << std::endl;
}
~Derived()
{
std::cout << "derived dtor" << std::endl;
}
};
template <typename T>
Derived<T> MakeDerived(T&& value)
{
return Derived<T>(std::forward<T>(value));
}
struct Dummy {};
int main()
{
auto test = MakeDerived(Dummy());
}
这段代码在 gcc-4.5 和 gcc-4.6 上编译得很好。gcc-4.7 的错误是:
test.cpp: In function ‘int main()’:
test.cpp:61:34: error: use of deleted function ‘Derived<Dummy>::Derived(const Derived<Dummy>&)’
test.cpp:37:8: note: ‘Derived<Dummy>::Derived(const Derived<Dummy>&)’ is implicitly deleted because the default definition would be ill-formed:
test.cpp:37:8: error: use of deleted function ‘Base<T>::Base(const Base<T>&) [with T = Dummy; Base<T> = Base<Dummy>]’
test.cpp:16:3: error: declared here
test.cpp: In instantiation of ‘Derived<T> MakeDerived(T&&) [with T = Dummy]’:
test.cpp:61:34: required from here
test.cpp:54:43: error: use of deleted function ‘Derived<Dummy>::Derived(const Derived<Dummy>&)’
我在这里遗漏了什么还是应该在 gcc 4.7 上也能正常编译?当我在 Derived 类上注释掉析构函数时,一切都很好。
gcc version 4.5.3 (Ubuntu/Linaro 4.5.3-12ubuntu2)
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-11precise2)