关于模板替换示例的混淆

时间:2015-04-28 08:15:06

标签: c++ c++11 variadic-functions sfinae

我很担心这个代码来自" 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类型?那么这怎么可能呢?

1 个答案:

答案 0 :(得分:5)

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

在这种情况下,不评估函数调用(因为它仅在未评估的上下文中使用,作为decltype的操作数),因此没有未定义的行为,只是编译时尝试匹配具有合适过载的函数调用。