关于模板替换示例的混淆
Confusing regarding a template sustitution example
我对"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
的操作数),因此没有未定义的行为,只是编译时尝试将函数调用与合适的重载相匹配。
相关文章:
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 为什么这个分配器不适用于"std::allocate_shared"?奇怪的模板替换错误
- 类成员函数参数列表是否可以依赖于模板参数?
- 依赖于模板的错误
- 将 c++ 类成员函数专用于模板类
- C++ 使函数调用依赖于模板参数
- c ++如何将模板应用于模板类的孩子/朋友?
- 如何修复"没有依赖于模板参数的参数'glGenVertexArrays'......"C++ 中的错误
- 如何转发声明依赖于变量定义的类,而变体定义又依赖于模板化类?
- 在参数相关查找之前进行模板替换的任何方法(或解决方法?
- 使用 std::enable_if 重载函数以避免模板替换错误
- 动态强制转换适用于模板成员函数内的共享指针和弱指针,无需代码重复
- 如何确保 "<<" 运算符适用于模板化 ADT 定义中的任何泛型类型?
- 将 const 限定符应用于模板参数时的不同编译器行为
- 如何定义依赖于模板参数的类型定义
- 模板替换误差与初始器列表
- 如何使用类型专用化模板方法,该类型本身就是一个模板,其中只有返回类型依赖于模板类型
- PHP 相当于C++模板
- 仅专用于模板类的一个方法(部分)