is_copy_constructible_v<const void*[N]> 自 c++20 起在 GCC 上产生 true

Vai*_*Man 8 c++ type-traits c++20

正如标题中提到的:

#include <type_traits>

int main() {
  using Ptr = const void*;
  using Arr = Ptr[3];

  // gcc:   passed since c++20
  // clang: failed
  static_assert(std::is_copy_constructible_v<Arr>);

}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/enKre9fxr

c++20 中是否发生了导致此行为的更改?

我还发现此错误报告被标记为无效,因为

这是按照指定的方式运行的。

const void* const a[10];
const void* const b[10](a);
Run Code Online (Sandbox Code Playgroud)

是 C++20 中的有效代码;它b[0]使用&a[0]转换为 a进行初始化const void*,其余部分b使用空指针。

案例void*

void* const a[10];
void* const b[10](a);
Run Code Online (Sandbox Code Playgroud)

这是无效的,因为&a[0]是 a void* const*; void*不允许将其转换为,因为它会消除常量性。

然后我尝试了这个https://godbolt.org/z/zvTr4orvd。然而GCC无法编译b(a)b{a}没问题,但我认为这不是复制构造,而是列表初始化。我错了吗?

const void* const a[10];
const void* const b[10](a);
Run Code Online (Sandbox Code Playgroud)