可重复的例子:
#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测试了这个.
来自参考:
如果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)
是不正确的.
数组是聚合,因此聚合初始化在这里发挥作用,而不是构造.