使用 std::function 模板时,出现歧义可能由于多个可能的过载而出现。具体来说,请考虑以下代码片段:
#include
using namespace std;
int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
}
歧义源于这样一个事实: function
std::function 的模板参数的签名在声明和定义期间被视为其类型的一部分。然而,在对象构造过程中情况并非如此。
std::function 与 C 中的许多函数对象一样,使用一种称为类型擦除的技术。这使得它能够接受任意对象或函数,只要它们在调用时满足预期的签名即可。缺点是与不匹配签名相关的错误发生在实现的深处,而不是在构造函数级别。
存在三个主要选项来规避这种歧义:
虽然 std::function 的模板参数确实在声明和定义期间确定了其类型,但它在对象构造中不起任何作用。当构造函数接受任意参数时,这可能会导致歧义。为了解决这个问题,程序员可以使用显式类型转换、函数对象包装或 TMP。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3