为什么std::reference_wrapper不是默认可构造的
Why is std::reference_wrapper not default constructible?
我觉得阻止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
,但在其他情况下,您不需要进行任何检查。
- 初始化具有非默认构造函数的std::数组项的更好方法
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- 使用 std::分配器在 constexpr 中进行默认初始化
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- std::map:当元素不可默认构造时创建/替换元素
- 如何默认启动 std::vector
- 如何在 c++ 中使用默认值将 std::set 转换为 std::map
- 为什么 std::move 不将默认移动构造函数中的源变量更改为默认值?
- 为什么std::atomic的默认构造函数不默认初始化底层存储值
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 静态std::unordereded_map的默认值
- 为什么用默认构造函数构造std::string对象时行为不同
- std::tuple默认构造函数,带有move可构造元素
- 默认情况下,"std::shared_ptr"不应该使用"std::d efault_delete"吗?
- 没有适用于 std::unique_ptr 的适当默认构造函数
- 当 T 不可默认构造时,构造函数初始值设定项列表中 std::array<T,N> 的初始化
- std::map 在 [] 上调用默认构造函数,在 insert() 上调用复制构造函数
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- std::vector 默认构造函数可以抛出异常吗?
- 是否存在GCC错误:默认std :: function