为什么std :: reference_wrapper不能默认构造?

Dej*_*avu 10 c++ reference wrapper c++11

我觉得防止std::reference_wrapper<T>默认构造使得它更难使用,即使使用默认构造的reference_wrapper会导致运行时异常.

但是,a reference_wrapper是完全可复制的,因此它的值总是可以更改,那么为什么要阻止它默认使用 null引用呢?它使许多使用案例变得更加简单,使用它,observer_ptr不再需要提议- 为什么需要冗余?默认的可构造性reference_wrapper将统治它们!

思考?

Rak*_*111 9

但是,reference_wrapper是完全可复制的,因此它的值总是可以更改,那么为什么要阻止它默认使用null引用呢?

什么是点std::reference_wrapper有一个值?如果您需要一个空值,只需使用指针:P

std::reference_wrapper被构建为引用的包装器,就是这样.它必须像引用一样,否则它不会是包装器而是其他东西.有一些用例,如果你允许它的默认值,它可能会破坏.如果您需要一个值,可以使用其他东西,比如指针,或者使用引用的限制.

另外,你自己陈述一个理由:

[...]即使使用默认构造的reference_wrapper也会导致运行时异常.

什么是没有提及的意义?有一个std::reference_wrapper暗示它指的是某些东西,就像参考一样.每次使用引用来查看它是否为null时,添加空值只意味着附加代码.

它使许多使用案例更加简单[...]

也许吧.但它会使其他用例变得更加困难.您需要检查包装器是否有效,不要忘记在用作具有默认构造函数的成员时进行初始化,等等.

简而言之,std::reference_wrapper它只是引用的包装器,因此不能仅仅是一个简单的引用.在这里,你可能需要一切都有优势和劣势,std::observer_ptr但在其他情况下,你不需要做任何检查.

  • Nullptr继承自C,它继承自从Algol W返回的C前身的任何东西.只有nullptr标识符被添加到C++以抵消遗留NULL的基本无类型特性.请参阅我关于Algol W的其他评论.无论如何,如果你需要一个可以为空的可分配引用,只需使用一个指针,因为这就是指针所在.我们其余的人特别要求提供不可空的参考. (2认同)
  • “因此,除了简单的参考之外,不能充当其他东西。” - 引用不可重新分配,reference_wrapper 可以。所以这不完全是一个参考 (2认同)