以下小于 (<) 运算符的 T 类型是合法的?
What are the type T for which following less than(<) operator is legitimate?
在阅读Alexander Stepanov的《编程笔记》一书时,我遇到了他提到的以下问题(第07页)。这是关于小于(<)运算符对于任何类型T。
- 解释为什么这对任何T类都是错误的
template<typename T> bool operator<(const T& x, const T& y) { return true; }
- 解释T的哪些要求使该定义合法
template<typename T> bool operator<(const T& x, const T& y) { return false; }
我无法理解上面的代码可以很好地工作的T类型是什么。到目前为止,我认为(第二点)以下类型(指针)可能是合法的。我知道这并没有多大意义(比较指针类型不是一个好主意),这也取决于创建了哪个order对象。
class test { };
test x;
test y;
// &x = 0x7fffffffe0bd, &y = 0x7fffffffe0be
bool out = &y < &x;
//out = 0;
我是不是遗漏了一些显而易见的东西?。有人能解释一下这两种情况吗?。
解释T的哪些要求使该定义合法?
template<typename T>
bool operator<(const T& x, const T& y) {
return false;
}
所有实例都被认为是"相等"的任何类型。
a < b; // false
b < a; // false
以上内容对于a == b
来说是非常好的。因此,为了一致性,如果T
有一个operator==
,它应该总是返回true
。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- JS相等运算符(如===)是否可以使用embind类型
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 将所有模板类型传递给运算符,而不指定所有类型
- 标准库类型的赋值运算符的引用限定符
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 如何确保接受的C++模板类型使运算符重载?
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- C2679 二进制"<<":未找到采用右操作数类型的运算符
- 使用类型id运算符的最佳替代方法
- 为什么 std::make_shared 无法编译带有已删除运算符 new 的类型?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- 表达式必须具有类类型(运算符)
- 使用许多类型运算符过载时,模棱两可的超载
- 类型转换为类型&&运算符
- 返回类型 ?:运算符和 C++ Primer 中的措辞
- 返回类型与返回类型(运算符++)不相同,也不协变