我正在尝试使用联合体,并创建了一个带有匿名联合体成员的示例类A。由于联合体包含一个std::string
和一个std::vector
,因此我需要为该类定义析构函数。但是,当我尝试手动调用~string()
时出现问题。
union.cpp: In destructor 'A::~A()':
union.cpp:14:14: error: expected class-name before '(' token
s_.~string();
我不理解这个向量的问题。如果我删除对 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
,而不仅仅是string
。 - UnholySheepstd::string
似乎无法工作:http://coliru.stacked-crooked.com/a/fd0d78d2219c168a - HolyBlackCatstd::variant
的东西时是必要的,这正是 OP 在此处所做的。当然,使用std::variant
本身会更好。 - interjaystd::variant
。那是 C++17 中 union 的替代品吗? - dav