为什么 C++20 中的 std::reference_wrapper<void> 没有编译错误?

Why no compile error for `std::reference_wrapper<void>` in C++20?

#include <functional>
#include <type_traits>

template<typename T>
requires (!std::is_void_v<T>)
struct A {};

int main()
{    
    A<void>*                      p1{}; // compile error as expected.
    std::reference_wrapper<void>* p2{}; // no expected compile error!    
}

现在因为 C++20 有 concepts 限制 class 模板参数,并且 voidstd::reference_wrapper 无效:

为什么在 C++20 中 std::reference_wrapper<void> 没有编译错误?

因为没有人为std::reference_wrapper写出requires (!std::is_void_v<T>)的概念。我同意,void 不应该对 std::reference_wrapper 有效,允许 void 可能是标准的疏忽。

你会认为 std::reference_wrapper<void> 无论如何都不会编译,因为 void& 是不合法的。但是 std::reference_wrapper 在幕后使用 指针 而不是引用,并且 void* 是一个完全合法的指针,这就是 std::reference_wrapper<void> 编译的原因。