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

时间:2017-01-09 05:34:18

标签: c++ c++11 reference wrapper

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

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

思想?

1 个答案:

答案 0 :(得分:9)

  

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

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

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

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

  

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

什么是没有提及的意义?拥有std::reference_wrapper意味着它引用了某些内容,就像引用一样。每次使用引用来查看它是否为空时,添加空值只意味着附加代码。

  

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

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

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