当前位置: 首页 > 知识库问答 >
问题:

Unqualified sort()--为什么它在std::vector上使用而不是在std::array上使用时进行编译,以及哪个编译器是正确的?

暨修洁
2023-03-14

std::array上调用std::sort()时:

#include <vector>
#include <array>
#include <algorithm>

int main() {
    std::vector<int> foo{4, 1, 2, 3};
    sort(begin(foo), end(foo));

    std::array<int, 4> foo2{4, 1, 2, 3};
    sort(begin(foo2), end(foo2));
}

gcc和clang都在std::数组的排序上返回一个错误——clang说

错误:使用未声明的标识符“sort”;你是说“性病::分类”吗?

更改为std::sort(begin(foo2),end(foo2))解决了这个问题。

MSVC按编写的方式编译上面的代码

为什么std::vectorstd::array在治疗上存在差异;哪个编译器是正确的?

共有1个答案

贲永思
2023-03-14

这取决于开始结束结果的类型,以及它如何与参数相关的查找一起工作。

sort(begin(foo), end(foo));

你得到

sort(std::vector<int>::iterator, std::vector<int>::iterator)

而由于std::向量

sort(begin(foo2), end(foo2));

你得到

sort(int*, int*)

而且因为int*不是std的成员,ADL不会查看std,您也找不到std::排序

这在MSVC中有效,因为

sort(begin(foo2), end(foo2));

变成

sort(std::_Array_iterator, std::_Array_iterator)

由于std::_Array_iteratorstdADL findssort的一部分。

这两个编译器都具有正确的行为std::vectorstd::array对迭代器使用的类型没有任何要求,除非它满足LegacyRandomAccess迭代器的要求,并且在C 17中对于std::array来说,该类型也是一个LiteralType,在C 20中是一个ConstExpriter

 类似资料:
  • 在过去的几个月里,我一直在学习C语言并使用终端。我的代码使用g和c11编译并运行得很好,但在过去几天里它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的C标准。 我第一次遇到的错误包括 尝试使用ecg$g-o stoi_试验stoi_试验编译。cpp-std=c 11 大堆cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;你是说“阿托伊”吗?in

  • 以下是代码(假设id和速度已经初始化,并且包含的内容正确):

  • 今天我遇到了一个有趣的问题,是我自己打错的。我创建了一个lambda,它接受了对结构的引用,并错误地将其设置为按值接收参数的std::函数。 这里有一个更简洁的版本: 使用godbolt检查显示,使用MSVC编译成功,但对于Clang和GCC都失败了。 这是MSVC编译器中的bug吗?

  • 我正在尝试对对象的向量进行排序。我编写了一个函数来比较对象。它似乎在我的编译器上运行得很好,但不是我学校服务器上的编译器。 我收到这个错误。。。 /usr/lib/gcc/i686 redhat linux/4.4.7/../../../..//包括/c/4.4.7/bits/stl\U algo。h: 131:错误:“Student”类型引用的初始化无效 /usr/lib/gcc/i686 re

  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 考虑以下行: 这不应该编译,因为< code>std::stringstream::运算符 似乎主要编译器现在接受了过去没有接受的这段代码。我想了解发生了什么标准更改来编译它? 我用gcc、clang和msvc做了一些测试,我可以找到发生变化的版本: 你可以在这里找到测试