这个问题也适用于boost::function和std::tr1::function。
std::function 不等于平等:
#include <functional>
void foo() { }
int main() {
std::function<void()> f(foo), g(foo);
bool are_equal(f == g); // Error: f and g are not equality comparable
}
在C ++ 11中,operator==和operator!=重载根本就不存在。在早期的C ++ 11草案中,重载被声明为已删除,并带有注释(N3092§20.8.14.2):
// deleted overloads close possible hole in the type system
它没有说“类型系统中可能的孔”是什么。在TR1和Boost中,已声明但未定义重载。TR1规范注释(N1836§3.7.2.6):
这些成员函数应保持未定义状态。
[ 注意:类似布尔的转换打开了一个漏洞,可以通过==或比较两个函数实例!=。这些未定义的void运算符消除了漏洞,并确保了编译时错误。—尾注 ]
我对“漏洞”的理解是,如果我们有bool转换函数,则该转换可用于相等比较(和其他情况):
struct S {
operator bool() { return false; }
};
int main() {
S a, b;
bool are_equal(a == b); // Uses operator bool on a and b! Oh no!
}
我给人的印象是,C ++ 03中的安全布尔用法和C ++ 11中显式转换函数的使用避免了这种“漏洞”。Boost和TR1都使用安全布尔用法,function而C ++ 11使bool转换函数明确。
作为同时具有两者的类的示例,std::shared_ptr两者都具有显式bool转换函数并且具有相等的可比性。
为什么std::function平等不具有可比性?什么是“类型系统中可能的孔”?std::shared_ptr有何不同?
三国纷争
料青山看我应如是
相关分类