为什么“ polymorphic_allocator”采用“ memory_resource”指针而不是引用?

时间:2019-05-06 23:12:27

标签: c++ language-lawyer c++17 allocator

C ++ 17标准说:

  

[mem.poly.allocator.ctor]

polymorphic_allocator(memory_resource* r);
     
      
  • 要求: r不为空。

  •   
  • 效果:memory_­rsrc设置为r

  •   
  • 抛出:没事。

  •   
  • [注意:”此构造函数提供从memory_­resource*的隐式转换。 — 尾注]

  •   

如果“ requires” 子句提到memory_resource*必须为非空,那么接受memory_resource&而不是r有什么意义?

Bloomberg¹样式指南鼓励接受将要通过指针而不是引用进行突变的参数,以便调用方的“&”号成为可见的突变标记。但是,标准中没有此类先例。

r被用作指针而不是参考的原因是什么?


¹pmr被彭博社大量参与标准化,因为该公司使用多态分配器模型。

1 个答案:

答案 0 :(得分:7)

N3916

  

请注意,设计内存资源库是为了使ShoppingList构造函数接受指向memory_resource pointer 而不是接受指向 memory_resource。有人指出,一种常见的做法是在空指针超出约定的情况下使用引用而不是指针。但是,还有一种更引人注目的实践,那就是避免使用通过引用获取对象并存储其地址的构造函数。我们还希望避免传递非const引用,因为通常也将其视为不好的做法(在重载运算符中除外)。