为什么 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 模板参数,并且 void
对 std::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>
编译的原因。
#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 模板参数,并且 void
对 std::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>
编译的原因。