我写了一个答案here来使用qsort
来排序数组数组。由于在swap
操作中使用了赋值运算符,我无法使用sort
。
我相信我的答案的规定是:
数组元素的类型必须是TrivialType,否则行为未定义
所以我的问题是: int[2]
是“TrivialType”吗?
提示此问题的答案中的实际代码是:
int array[5][2] = { {20, 11}, {10, 20}, {39, 14}, {29, 15}, {22, 23} };
static const auto SIZE = size(*array);
qsort(array, size(array), sizeof(*array), [](const auto lhs, const auto rhs) {
const auto first = reinterpret_cast<const int*>(lhs);
const auto last = next(first, SIZE);
const auto its = mismatch(first, last, reinterpret_cast<const int*>(rhs));
if (its.first == last) {
return 0;
} else if (*its.first < *its.second) {
return -1;
} else {
return 1;
}});
答案 0 :(得分:1)
是的,int[2]
是一种微不足道的类型。来自basic.types / 9
...标量类型,普通类类型(Clause [class]),这样的数组 类型和这些类型的cv限定版本 ([basic.type.qualifier])统称为普通类型。 ...
int是标量类型。
答案 1 :(得分:1)
所以我的问题是:
int[2]
是“TrivialType”吗?
是的,是的。
您可以轻松地检查这一点,所有必要的工具都在<type_traits>
:
#include <type_traits>
#include <iostream>
int main() {
int a[2];
std::cout << "a is " << (std::is_trivial<decltype(a)>()?"":"non ") << "trivial" << std::endl;
}
输出
a is trivial
请参阅Live Demo
答案 2 :(得分:1)
int
是[basic.fundamental]的算术类型,算术类型也称为标量类型[basic.types] / 9
算术类型(3.9.1),枚举类型,指针类型,指向成员类型的指针(3.9.2),std :: nullptr_-t和这些类型的cv限定版本(3.9.3)统称为标量类型。
然后我们
标量类型,普通类类型(第9条),此类型的数组和这些类型的cv限定版本(3.9.3)是统一的 称为普通类型
强调我的
因此标量类型和标量数组都是普通类型。
草案N3797的所有引用