c++ - 无法手动调用 std::string 的析构函数

标签 c++

我正在试验 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/

相关文章:

c++ - 如何处理这个异常

c++ - 相对于函数输入初始化全局数组

c++ - 从数据库中提取数据时使用 QVariant 的正确方法

c++ - C++中的全局类

c++ - 数组中的错误功能排序

c++ - 从 [0.5 - 1] 规范化到 [0 - 1]

c++ - 创建带变量的字符串

c++ - 缩小 QGraphicsView 会崩溃

c++ - 当我在 C++ 中推回 vector 类上的元素时出现段错误

c++ - 使用 C++ 在远程 Windows PC 上创建文件夹?