关于模板替换示例的混淆

Confusing regarding a template sustitution example

本文关键字:于模板 替换      更新时间:2023-10-16

我对"C++编程语言 4th, 28.4.4"中的这段代码感到困惑

template<typename T>
struct get_f_result {
private:
    template<typename X>
    static auto check(X const& x) −> decltype(f(x)); // can call f(x)
    static substitution_failure check(...); // cannot call f(x)
public:
    using type = decltype(check(std::declval<T>()));
};

我特别困惑的部分是这里的这一行:

static substitution_failure check(...); // cannot call f(x)

但我记得...不能接受非豆荚类型?那么这怎么可能呢?

...可以采用任何类型;传递非 POD 类型可能不受支持,但在语法上是有效的。

在这种情况下,函数调用不会被计算(因为它仅在未计算的上下文中使用,作为decltype的操作数),因此没有未定义的行为,只是编译时尝试将函数调用与合适的重载相匹配。