考虑一个例子。
#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;如果类型名称合格但没有解释原因。
(我使用&#34;解析&#34;主要是因为他做了,我没有想到更好的词。不要读太多。我&# 39;我不是说编译器做错了什么。)
答案 0 :(得分:0)
原因是std::string
实际上并没有命名类类型。除此之外,这意味着没有名为~string()
的析构函数。
std::string
在<string>
内实际上是一个typedef(替代名称),用于专门化名为std::basic_string<char>
的模板类类型。
typedef
形式的typedef some_class_name another_name
不会导致析构函数存在,名为~another_name
。