为什么std::reference_wrapper不是默认可构造的

Why is std::reference_wrapper not default constructible?

本文关键字:默认 std reference wrapper 为什么      更新时间:2023-10-16

我觉得阻止std::reference_wrapper<T>为默认可构造会使其更难使用,即使使用默认构造的reference_wrapper会导致运行时异常。

然而,reference_wrapper是完全可复制的,所以它的值总是可以更改的,那么为什么要阻止它在默认情况下具有空引用呢?它使许多用例更加简单,有了它,就不再需要所提出的observer_ptr了——为什么需要冗余?默认的可构造reference_wrapper将统治它们!

想法?

然而,reference_wrapper是完全可复制的,所以它的值总是可以更改的,那么为什么要阻止它默认具有null引用呢?

std::reference_wrapper具有null值的意义何在?如果你需要一个空值,只需使用一个指针:P

std::reference_wrapper是作为引用的包装器构建的,仅此而已。它的行为必须像引用一样,否则它就不是包装器,而是其他东西。它有一些用例,如果你允许它的默认值,它可能会被破坏。如果你需要一个null值,要么使用其他东西,比如指针,要么接受引用的限制。

此外,你自己也说明了一个原因:

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

什么都不引用有什么意义?拥有std::reference_wrapper意味着它指的是某种东西,就像引用一样。添加null值意味着每次使用引用时都要添加额外的代码来查看它是否为null。

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

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

简言之,std::reference_wrapper只是引用的包装器,因此不能表现为普通引用之外的其他内容。任何东西都有优点和缺点,在这里,您可能需要std::observer_ptr,但在其他情况下,您不需要进行任何检查。