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

kam*_*aze 1 c++ arrays c++17

可重复的例子:

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

我用clang 5和gcc 7测试了这个.

gsa*_*ras 7

来自参考:

如果T是一个对象或引用类型和变量定义T obj(std::declval<Args>()...);良好形成的,提供了构件恒定值等于true.在所有其他情况下,价值是错误的.

在你的例子T obj(std::declval<Args>()...);中,格式不正确.

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

结果,这个:

int obj[2](int, int);
Run Code Online (Sandbox Code Playgroud)

是不正确的.

数组是聚合,因此聚合初始化在这里发挥作用,而不是构造.