首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有const引用的可变模板

带有const引用的可变模板
EN

Stack Overflow用户
提问于 2017-04-03 15:57:39
回答 2查看 2.7K关注 0票数 4

我的项目使用自定义分配器,它以下列方式构造对象:

代码语言:javascript
复制
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...);
}

有一个类,包含作为字段的const引用:

代码语言:javascript
复制
struct A {
  A(const string& s) : str_(s) {
    cout << &s << '\n';
  }

  const string& str_;
};

但是当我试图创建一个对象时,我得到了错误的结果:

代码语言:javascript
复制
string* str = new string("some string");
cout << str << '\n';
A* a = create<A>(*str);

产出:

代码语言:javascript
复制
0x7fffc8004db4
0x7fffd5436050

我认为construction字段(str_)应该包含与工程机械相同的地址,但显然不是这样。

为什么会发生这种情况,如何避免呢?

Ofc,我情不自禁地使用自定义分配器,这是强制性的,我不会问。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-03 16:05:01

代码语言:javascript
复制
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...);
}

您所有的变量参数都将按值传递。因此,正在制作一份副本。您可能希望使用转发引用:

代码语言:javascript
复制
template <typename T, typename... Args>
T* create(Args&&... args)
{
    auto memory =  // request "bare" memory
    // call object constructor
    return new(memory) T(std::forward<Args>(args)...);
}

指纹:

0x111ac20 0x111ac20

Demo

再次考虑数据对齐时,您想要使用的位置-新。

票数 4
EN

Stack Overflow用户

发布于 2017-04-03 16:05:51

打电话

代码语言:javascript
复制
A* a = create<A>(*str);

创建*str的副本,并使用该副本调用函数,因为该函数声明为

代码语言:javascript
复制
template <typename T, typename... Args>
T* create(Args... args) {...}

a有一个对一个对象的引用,该对象不再活着。

使用

代码语言:javascript
复制
template <typename T, typename... Args>
T* create(Args&&... args)
{
   T* object = // request "bare" memory
   // call object constructor
   return new(reinterpret_cast<void*>(object)) T(std::forward<Args>(args)...));
}

而不是。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43189185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档