Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新定义<;在字符串的stl算法中使用的运算符_C++_Templates_Operator Overloading_Std - Fatal编程技术网

C++ 重新定义<;在字符串的stl算法中使用的运算符

C++ 重新定义<;在字符串的stl算法中使用的运算符,c++,templates,operator-overloading,std,C++,Templates,Operator Overloading,Std,是否可以重新定义运算符否,不可以。将函数添加到标准命名空间是未定义的行为。[namespace.std]/1声明: < C++程序的行为是不定义的,如果它向命名空间STD或命名空间STD中的命名空间添加声明或定义,除非另有说明。只有当声明依赖于用户定义的类型且专门化满足原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板专门化添加到命名空间std 如果要更改std::sort排序方式,则可以提供lambda并定义所需内容 std::sort(std::begin(foo), st

是否可以重新定义
运算符否,不可以。将函数添加到标准命名空间是未定义的行为。[namespace.std]/1声明:

< C++程序的行为是不定义的,如果它向命名空间STD或命名空间STD中的命名空间添加声明或定义,除非另有说明。只有当声明依赖于用户定义的类型且专门化满足原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板专门化添加到命名空间std

如果要更改
std::sort
排序方式,则可以提供lambda并定义所需内容

std::sort(std::begin(foo), std::end(foo), [](const auto& lhs, const auto& rhs) { /* your code here */ });
是否可以在不修改std名称空间的情况下为字符串重新定义运算符<

当然,您可以在另一个命名空间中定义重载。但正如您所发现的,除非显式限定,否则重载解析不会找到它

是否可以使用自定义运算符<进行std::sort,而不将其包含到std命名空间中

是的,而且你似乎已经知道如何:

是的,我知道,我可以传递另一个比较器到std::sort

这正是comparator参数的目的

我也正确,将这样的模板专门化添加到std名称空间是正确的吗


这不是模板专门化;它是一个函数定义,您不能将函数定义添加到std名称空间,否则行为是未定义的。您可以添加模板专门化,但前提是至少有一个类型参数是用户定义的类型。

-请查看所有重载。而您的
操作符首先,将内容放入
std
名称空间的规则非常严格。除非你知道例外情况,否则不要这样做。正常人怎么了?创建自己的比较函数的目的是什么?你想要解决的实际问题是什么?你的问题的核心仅仅是你想要
std::sort
以不同的顺序排列字符串吗?所以你知道你应该做什么,现在想知道你是否正确地滥用了系统?我认为否决票是不合理的。这个问题写得很好,有一个可编译的例子。请不要因为这里的概念不可靠就投反对票。谢谢你回答问题的第二部分。根据第一部分,是的,我知道我可以传递lamda或functional object,但如果可以这样重新定义,<,这对我来说很有趣。@AndreyNekrasov您将无法定义
运算符您所说的是正确的,但您可能希望通过注意将函数定义添加到
std
会产生未定义的行为来扩大最后的评论。@Peter UB现在提到了。+1还有一点:
std::sort
例如,将始终使用
操作符@ArneVogel的重载“std::sort例如,将始终使用运算符<的重载作为std::basic_字符串,该字符串按优先级在std内“您能解释一下您的理由吗?当前名称空间中的候选人总是获胜,这就是
std
对于
std::sort
。这就是标准中定义非限定名称查找的方式。还要注意,调用方的名称空间根本不重要。这看起来非常不方便,但如果真的很重要,这意味着模板的相同实例化可能会根据调用方的名称空间表现出不同的行为,这从ODR的角度来看是非常有问题的。下面是一个小示例,说明了
foo::f()
如何通过与直接调用方位于同一名称空间而获胜:
std::sort(std::begin(foo), std::end(foo), [](const auto& lhs, const auto& rhs) { /* your code here */ });