Pav*_*Dub 5 c++ destructor default move-semantics c++11
我遇到了一个问题,当其子类具有显式默认析构函数时,超类的移动构造函数无法正确调用。当析构函数被隐式默认时(在超类定义中根本没有提供),移动构造函数确实会被调用。
我知道编译器应该应用于默认移动构造函数的限制。然而,我无论如何都确信编译器在应用这些规则时不应该区分显式/隐式默认的析构函数(或构造函数)。换句话说,显式默认的析构函数不应被视为用户定义的析构函数(与空的用户定义析构函数相反)。
仅使用 MSVC 2019 进行测试。
我还是 MSVC 在这儿吗?
#include <iostream>
class A {
public:
A() = default;
A(const A&) { std::cout << "Auch, they'r making copy of me(?!)" << std::endl; }
A(A&&) { std::cout << "I am moving :)" << std::endl; }
~A() = default;
};
class B : public A {
public:
};
class C : public A {
public:
C() = default;
};
class D : public A {
public:
~D() = default;
};
class E : public A {
public:
E() = default;
E(const E&) = default;
E(E&&) = default;
~E() = default;
};
int main()
{
std::cout << "\n---- A ----\n" << std::endl;
A a;
A a2(std::move(a));
std::cout << "\n---- B ----\n" << std::endl;
B b;
B b2(std::move(b));
std::cout << "\n---- C ----\n" << std::endl;
C c;
C c2(std::move(c));
std::cout << "\n---- D ----\n" << std::endl;
D d;
D d2(std::move(d));
std::cout << "\n---- E ----\n" << std::endl;
E e;
E e2(std::move(e));
}
Run Code Online (Sandbox Code Playgroud)
预期:在所有情况下显示“我正在搬家:)”
实际:在情况 D 中显示“哎呀,他们正在复制我(?!)”
| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |