为什么 'std::is_constructible_v<int[2], int, int> == false'

Why is `std::is_constructible_v<int[2], int, int> == false`

本文关键字:int false gt is std constructible 为什么 lt      更新时间:2023-10-16

可重复的示例:

#include <type_traits>
static_assert(std::is_constructible_v<int[2], int, int>, "fails against my expectations");

我用Clang 5和GCC 7进行了测试。

来自参考:

如果t是对象或参考类型,并且变量定义 T obj(std::declval<Args>()...);构型,提供了等于true的成员常数值。在所有其他情况中,值为false。

在您的示例中, T obj(std::declval<Args>()...);不是

这是因为int[2]是一个普通的数组,它没有任何构造函数。

结果,这是:

int obj[2](int, int);

是不形成的。

数组是聚集体,因此聚集的初始化在这里发挥作用,而不是结构。

std::is_constructible的目的和定义是检查指定类型的对象是否可以像以下方式构造:

T obj(std::declval<Args>()...);

和上面的数组根本不正确。数组没有任何构造函数,它是一个聚合的,应使用汇总初始化初始化。