ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 带有const引用的可变参数模板

2019-08-28 15:08:36  阅读:206  来源: 互联网

标签:c c11 variadic-templates memory-management pass-by-reference


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

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引用作为字段:

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,我不禁使用自定义分配器,这是强制性的,我不会问.

解决方法:

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...);
}

所有可变参数都将按值传递.因此正在制作副本.您可能想要使用转发引用:

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)...);
}

打印:

06002

Demo

每当您想使用placement-new时,请再次考虑数据对齐.

标签:c,c11,variadic-templates,memory-management,pass-by-reference
来源: https://codeday.me/bug/20190828/1752887.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有