在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::vector
和std::array
在治疗上存在差异;哪个编译器是正确的?
这取决于开始
和结束
结果的类型,以及它如何与参数相关的查找一起工作。
在
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_iterator
是std
ADL findssort
的一部分。
这两个编译器都具有正确的行为
std::vector
和std::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做了一些测试,我可以找到发生变化的版本: 你可以在这里找到测试