为什么可以正确解析显式析构函数调用中的限定类型名称?

时间:2015-01-02 16:41:06

标签: c++ destructor placement-new

考虑一个例子。

#include <string>

struct S {
    S() {
        new (&s) std::string("hi");
    }

    ~S() {
        // does not compile
        // s.~std::string();

        // compiles
        using std::string;
        s.~string();
    }

    union {
        std::string s;
    };
};

为什么注释掉的部分不能编译?

我从clang获得的错误消息显示编译器将std作为一种类型自行解析。

  

标识符&#39; std&#39;在对象销毁表达式中没有命名类型

为什么编译器不能确定std::string是哪种类型?这在某种程度上是不明确的吗?

我在Andrei Alexandrescu的演讲中意识到了这一点。它是在37:10。他很快就评论说这&#34;不会解析&#34;如果类型名称合格但没有解释原因。

http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C

(我使用&#34;解析&#34;主要是因为他做了,我没有想到更好的词。不要读太多。我&# 39;我不是说编译器做错了什么。)

1 个答案:

答案 0 :(得分:0)

原因是std::string实际上并没有命名类类型。除此之外,这意味着没有名为~string()的析构函数。

std::string<string>内实际上是一个typedef(替代名称),用于专门化名为std::basic_string<char>的模板类类型。

typedef形式的typedef some_class_name another_name不会导致析构函数存在,名为~another_name