c++ - 对模板替换示例感到困惑

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

我对“C++ 编程语言第 4 期,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 类型?那么这是如何工作的呢?

最佳答案

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

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

关于c++ - 对模板替换示例感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29913940/

相关文章:

java - java中的main方法为什么接受无效的字符串参数

java - 将元素添加到 Java vararg 调用的最易读的方式

c++ - C++ 子类是否可以共享相同的模板?

c++ - 在 Eclipse 中调试 Cocos2dx 应用程序 (Cpp)

c++ - 指向成员非类型模板参数的指针的实际使用

c++ - gsl::span 无法使用 std::regex 进行编译

c# - Scala:Java、C#、Scala 和 C++ 中的高级类、开放类型和通配符泛型

c++ - 函数重载的顺序很重要吗?

c++ - 使用 STL/Boost/Lambdas 调整映射迭代器

c - 将 va_list 传递给其他函数