为什么在没有为其数据类型定义运算符<时编译std::map代码?
我了解到将用户定义的类型传递给 a std::map(以及许多其他 STL 数据结构)需要定义operator <.
然而,这是否意味着编译器能够std::map在编译时验证 a 的声明是否正确?下面的代码std::map使用没有<运算符的用户定义数据类型声明 a ,仍然可以编译。有人能告诉我为什么这是真的吗?
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
struct Test{
int a;
string b;
};
int main()
{
map <Test, int> M; // shouldn't this line cause a compilation error, as operator < is not defined
// for class Test?
return 0;
}
回答
在 C++ (脚注)中,模板对其类型参数没有静态约束(与 C# 的where约束不同)。相反,C++ 模板参数的正确性只有在每个模板成员都由编译器实例化时才能确定(编译时类型实例化,而不是运行时对象实例化)。您的代码仅使用map's 的无参数构造函数,它不使用key_type's 的重载<运算符。
如果您对npmJavaScript 生态系统有经验,请将其视为极端的摇树:未使用的库函数不会被编译,如果它们未被编译,则它们不会受到编译器错误的影响。C++ 语言的这种零开销原则也被称为“你不为你不使用的东西付费”(尽管不要将此与“零成本抽象”混淆,后者是另外一回事)。
1:C++20 添加了模板参数约束,但我想我们不会在 STL 类型中看到很长一段时间,因为这将是一个重大的突破性变化:https : //en.cppreference.com/w/cpp/语言/限制