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

Why can't std::endl be passed as a function argument?

#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 不能作为函数参数传递?

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

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

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