Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么“多态分配器”使用“内存资源”指针而不是引用?_C++_Language Lawyer_C++17_Allocator - Fatal编程技术网

C++ 为什么“多态分配器”使用“内存资源”指针而不是引用?

C++ 为什么“多态分配器”使用“内存资源”指针而不是引用?,c++,language-lawyer,c++17,allocator,C++,Language Lawyer,C++17,Allocator,C++17标准规定: 要求:r为非空 效果:将memory\rsrc设置为r 他:没什么 [ 注意:此构造函数提供了从内存资源*的隐式转换- 尾注 ] 如果“requires”子句提到r必须为非空,那么接受内存资源*而不是内存资源&有什么意义 Bloombergª风格指南鼓励接受将通过指针而不是引用进行变异的参数,以便调用方一侧的符号成为变异的可视标记。但是,该标准中没有此类先例 将r作为指针而不是参考的原因是什么? 在彭博社的大量参与下,pmr标准化,因为该公司使用多态分配器模型。:

C++17标准规定:

  • 要求:
    r
    为非空

  • 效果:将
    memory\rsrc
    设置为
    r

  • 他:没什么

  • [ 注意:此构造函数提供了从
    内存资源*
    的隐式转换- 尾注 ]

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

Bloombergª风格指南鼓励接受将通过指针而不是引用进行变异的参数,以便调用方一侧的符号成为变异的可视标记。但是,该标准中没有此类先例

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


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

:

请注意,内存资源库的设计使得
ShoppingList
构造函数接受指向
内存资源的指针,而不是对
内存资源的引用。需要注意的是,一种常见做法是在空指针失效的情况下使用引用而不是指针。然而,有一种更令人信服的做法是避免构造函数通过引用获取对象并存储其地址。我们还希望避免传递非常量引用,因为这通常也被认为是不好的做法(重载运算符除外)


我想你的说明可能说明了原因。该设计深受彭博社的影响,但我个人无法说明这方面是否在会议上受到质疑。猜测:与
[io]的一致性使用
streambuf
指针的stream
s。这些是
std
中唯一的其他实体,我认为它们是一种类似的非所有权接口适配器。@chris:我只是觉得奇怪,这没有争议,因为它会简化措辞……委员会希望措辞尽可能简单:)我怀疑
Effects:将memory\rsrc设置为r。
可能是相关的子句。通过按指针而不是按引用获取参数,API鼓励程序员更仔细地考虑有关传入对象的对象生存期问题。特别是,当调用按引用获取参数的函数/方法时,programm没有仔细阅读文档的用户(阅读:我们大多数人;))可能不会期望该函数在调用返回后保留指向传入对象的指针,以供以后使用。我真的不明白为什么首选第二种做法。如果定义了指针而不是引用,我会理解他们为什么选择指针而不是引用。例如,使用get_default_资源,但它是一个非标准的扩展。但在本例中,他们引入了一种未定义行为的可能性,当传递NULL指针时,仅仅是因为他们想实现一些良好的实践。对我来说,这是胡说八道。现在用户必须阅读文档并理解NULL是不允许的,否则他将被取消定义不道德的行为。
polymorphic_allocator(memory_resource* r);