为什么 std::reference_wrapper 不是默认可构造的?
Why is std::reference_wrapper not default constructible?
我觉得阻止 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 [...]
是的,也许吧。但这会使 other 用例变得更加困难。您需要检查包装器是否有效,当用作具有默认构造函数的成员时不要忘记初始化它,等等。
简而言之,std::reference_wrapper
只是一个引用的包装器,因此只能作为一个普通引用。凡事有利有弊,在这里,你可能需要std::observer_ptr
,但在其他情况下,你不需要做任何检查。
我觉得阻止 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 [...]
是的,也许吧。但这会使 other 用例变得更加困难。您需要检查包装器是否有效,当用作具有默认构造函数的成员时不要忘记初始化它,等等。
简而言之,std::reference_wrapper
只是一个引用的包装器,因此只能作为一个普通引用。凡事有利有弊,在这里,你可能需要std::observer_ptr
,但在其他情况下,你不需要做任何检查。