使用 std::function 模板时,出现歧义可能由于多个可能的过载而出现。具体来说,请考虑以下代码片段:
<code class="cpp">#include <functional> using namespace std; int a(const function<int()>& f) { return f(); } int a(const function<int(int)>& 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. }</code>
歧义源于两个函数
std::function 的模板参数的签名在声明和定义期间被视为其类型的一部分。然而,在对象构造过程中情况并非如此。
std::function 与 C 中的许多函数对象一样,使用一种称为类型擦除的技术。这使得它能够接受任意对象或函数,只要它们在调用时满足预期的签名即可。缺点是与不匹配签名相关的错误发生在实现的深处,而不是在构造函数级别。
存在三个主要选项来规避这种歧义:
虽然 std::function 的模板参数确实在声明和定义期间确定了其类型,但它在对象构造中不起任何作用。当构造函数接受任意参数时,这可能会导致歧义。为了解决这个问题,程序员可以使用显式类型转换、函数对象包装或 TMP。
以上是`std::function` 的模板参数在对象构造期间会影响其类型吗?的详细内容。更多信息请关注PHP中文网其他相关文章!