我关注Stroustroup关于使用隐式联合的例子。
#include <string>
using namespace std;
class MemoryObject {
public:
enum class t { STRING, BOOLEAN };
t type;
MemoryObject& operator=(const MemoryObject& s) {
if (type == t::STRING && s.type == t::STRING) {
str = s.str;
return *this;
}
if (type == t::STRING) str.~string();
type = s.type;
switch (s.type) {
case t::BOOLEAN:
boolean = s.boolean;
break;
case t::STRING:
new(&str){s.str};
break;
default:
break;
}
return *this;
}
private:
union {
unsigned long boolean;
string str;
};
t stored;
};
另一方面,我在显式构造的调用上遇到以下错误:
/mnt/DEC4763AC47614CD/Progetti/object_converter/MemoryObject.h:30:27:
错误:'s'没有命名类型
new(&str)(s.str); ^ /mnt/DEC4763AC47614CD/Progetti/object_converter/MemoryObject.h:30:28:
错误:预期')'在'。'标记
之前new(&str)(s.str); ^
作为一个附带问题,我也想知道为什么我必须明确地使用using namespace std;
来调用显式的destroy str.~string();
,而另一方面,它可以写既不是str.~std::string();
也不是str.std::~string();
。我使用以下编译器:g++ (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406