无法手动调用 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部分感到困惑。

最新更新