无法手动调用 std::string 的析构函数
Unable to manually call destructor of std::string
我正在试验工会,并与匿名工会成员一起制作了此示例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 不是一个真正的类型,而是一个 typedef。
using std::string = std::basic_string<char>;
所以你需要调用basic_string析构函数。
~A()
{
if (is_string)
s_.~basic_string();
else
v_.~vector();
}
我只是遇到了同样的问题,以下内容对我有用:
typedef std::string string_alias;
sp->~string_alias();
似乎C++编译器对语句的~std::string
部分感到困惑。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 通过引用传递-为什么要调用这个析构函数
- 无法手动调用 std::string 的析构函数
- 您是否需要析构函数来销毁全局 int、float 或 std::string 变量
- 仅在调试时std::string析构函数中存在访问冲突
- 为什么 std::string 没有虚拟析构函数
- 在析构函数上自动安全地清除c++ std::string和std::vector的内容
- std::string会删除在析构函数中通过assign方法获得的内容吗?
- QString::toStdString()在std::string析构函数上崩溃