我正在尝试使用工会,并使用匿名工会成员将此示例类设为A。由于联合包含一个std::string和一个,因此std::vector我需要为该类定义一个析构函数。但是,当我尝试手动调用~string()我得到
union.cpp: In destructor 'A::~A()':
union.cpp:14:14: error: expected class-name before '(' token
s_.~string();
Run Code Online (Sandbox Code Playgroud)
我不知道这个向量。如果我删除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;
}
Run Code Online (Sandbox Code Playgroud)
使用std::delete_at(std::addressof(s_))确实适用于-std=c++17。这里发生了什么?
std :: string不是实类型,而是typedef。
using std::string = std::basic_string<char>;
Run Code Online (Sandbox Code Playgroud)
因此,您需要调用basic_string析构函数。
~A()
{
if (is_string)
s_.~basic_string();
else
v_.~vector();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |