c++ - 为什么 std::reference_wrapper 不是默认可构造的?

标签 c++ c++11 reference wrapper

我觉得防止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/

相关文章:

c++ - cpp.react 库的 C++ 源代码中出现奇怪的 "->* []"表达式

mysql - 用一个元组引用多行

c++ - 包含引用的 STL 映射无法编译

java - 如何在 JavaDoc 中引用具有简单名称的内部类方法?

c++ - 无法在 OpenCV 2.4.7 中从 Cam 捕获视频

c++ - 将 protobuf 字节类型存储在二进制文件中

c++ - 递归调用溢出

c++ - 为什么 ={} 初始化不适用于元组?

c++ - 如何使用枚举类值作为 for 循环的一部分?

c++ - 函数调用必须在常量表达式中具有常量值