我正在试验 union ,并将这个示例设为 A 类,其中包含匿名 union 成员。由于 union 包含一个 std::string
和一个 std::vector
我需要为该类定义一个析构函数。但是,当我尝试手动调用 ~string()
时,我得到了
union.cpp: In destructor 'A::~A()':
union.cpp:14:14: error: expected class-name before '(' token
s_.~string();
我不明白这个 vector 。如果我删除对 s._~string();
的调用,它可以正常编译。这是编译器错误吗?我正在使用 MinGW64。
#include <string>
#include <vector>
class A
{
public:
explicit A(const std::string &s) : s_ {s}, is_string {true} {}
explicit A(const std::vector<int> &v) : v_ {v}, is_string {false} {}
~A()
{
if (is_string)
s_.~string();
else
v_.~vector();
}
private:
union
{
std::string s_;
std::vector<int> v_;
};
bool is_string;
};
int main()
{
A a("Hello, World!");
return 0;
}
使用 std::delete_at(std::addressof(s_))
确实适用于 -std=c++17
。这是怎么回事?
最佳答案
std::string 不是真正的类型而是 typedef。
using std::string = std::basic_string<char>;
所以需要调用basic_string的析构函数。
~A()
{
if (is_string)
s_.~basic_string();
else
v_.~vector();
}
关于c++ - 无法手动调用 std::string 的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55892372/