为什么不能将 std::endl 作为函数参数传递?

时间:2021-04-24 08:37:41

标签: c++ overloading iostream template-argument-deduction

#include <iostream>

void f(auto x)
{
    std::cout << x;
}

int main()
{
    f(std::hex);  // okay

    f(std::endl); // error
                  // candidate template ignored: 
                  // couldn't infer template argument 'x:auto'
}

为什么不能将 std::endl 作为函数参数传递?

1 个答案:

答案 0 :(得分:2)

因为 std::endl 是函数模板,而 std::hex 不是,所以它是单个非重载函数。

将引用整个重载集的函数作为参数传递是通过解析为单个具体类型来完成的。

这里发生的情况是调用者想要通过尝试使 f 函数解析它来解析类型,除了 f 函数希望调用者解析为特定类型以便它知道什么推断。 “牢不可破的盾遇到剑被剑击破所有盾”的情况。

相关问题