我觉得防止std::reference_wrapper<T>
默认构造使其更难使用,即使使用默认构造的 reference_wrapper 会导致运行时异常。
然而,一个reference_wrapper
是完全可复制的,因此它的值始终可以更改,那么为什么要阻止它默认具有 the 空引用?它使许多用例变得更加简单,并且有了它,建议的 observer_ptr
不再需要 - 为什么需要冗余?默认构造 reference_wrapper
会统治他们!
想法?
最佳答案
However, a reference_wrapper is perfectly copyable, so it's value can always be changed, so why preventing it to have the null reference by default?
std::reference_wrapper
有一个 null 值有什么意义?如果你需要一个空值,只需使用一个指针 :P
std::reference_wrapper
被构建为引用的包装器,仅此而已。它的行为必须像引用一样,否则它就不是包装器而是其他东西。它有一些用例,如果您允许它的默认值,它可能会中断。如果您需要一个 null 值,要么使用其他东西,例如指针,要么忍受引用的限制。
另外,你自己说个理由:
[...] even though using a default constructed reference_wrapper causes a runtime exception.
空引用有什么意义?拥有一个 std::reference_wrapper
意味着它引用了某物,就像引用一样。添加空值意味着每次使用引用查看它是否为空时都会有额外的代码。
It makes many usage cases much simpler [...]
是的,也许吧。但这会使其他用例变得更加困难。您需要检查包装器是否有效,当用作具有默认构造函数的成员时不要忘记初始化它,等等。
简而言之,std::reference_wrapper
只是引用的包装器,因此除了普通引用之外不能作为其他东西。凡事有利有弊,在这里,你可能需要std::observer_ptr
,但在其他情况下,你不需要做任何检查。
关于c++ - 为什么 std::reference_wrapper 不是默认可构造的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41541593/