【发布时间】:2017-08-28 14:07:31
【问题描述】:
我的项目使用自定义分配器,它通过以下方式构造对象:
template <typename T, typename... Args>
T* create(Args... args)
{
T* object = // request "bare" memory
// call object constructor
return new(reinterpret_cast<void*>(object)) T(args...);
}
有一个类,包含常量引用作为字段:
struct A {
A(const string& s) : str_(s) {
cout << &s << '\n';
}
const string& str_;
};
但是当我尝试创建一个对象时,我得到了错误的结果:
string* str = new string("some string");
cout << str << '\n';
A* a = create<A>(*str);
输出:
0x7fffc8004db4
0x7fffd5436050
我认为 const 引用字段 (str_) 应该包含与工程机械相同的地址,但显然不是这样。
为什么会发生,如何避免?
Ofc,我忍不住要使用自定义分配器,这是强制性的,我不会问。
【问题讨论】:
标签: c++ c++11 memory-management pass-by-reference variadic-templates