为什么 'std::is_constructible_v<int[2], int, int> == false'
Why is `std::is_constructible_v<int[2], int, int> == false`
可重复的示例:
#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>()...);
和上面的数组根本不正确。数组没有任何构造函数,它是一个聚合的,应使用汇总初始化初始化。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 伪造事实↔false
- QueryWorkingSet总是返回false
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- 为什么 'std::is_constructible_v<int[2], int, int> == false'
- 为什么没有int或false的数据类型
- 警告 C4800:'int':强制值为 bool 'true' 或 'false'(性能警告)
- C++int函数.当零是有效的返回值时,我如何检测false
- 为什么 std::is_const<const int&>::value 的计算结果为 false?
- 为什么 boost::is_same<int const&, boost::add_const<int &>::value 等于 false?
- 在 int 返回函数中返回"false"