函数返回类型是否会影响重载的选择
Does the function return type affect the choice of an overload?
在这篇文章中,建议使用以下方法为定义dump()
成员函数的所有类定义operator<<
函数:
template <typename T, typename charT>
auto operator<< (std::basic_ostream<charT> & str, const T & t) -> decltype(t.dump(str))
{
return t.dump(str);
}
为什么这个函数模板不能捕获所有类型,包括那些没有定义dump
成员函数的类型?我的意思是,在选择重载时,返回类型是函数签名的一部分吗?
返回类型本身并不重要。当声明对实例化无效时,所提出的技术依赖于SFINAE(替换失败不是错误)来删除重载。也就是说,当编译器尝试用没有可访问的dump(str)
成员的类型T
实例化上述operator<<()
时,decltype(t.dump(str))
将无效。它没有失败,而是决定这个重载不起作用,并将其从候选重载集中删除。
一旦收集到候选者,过载解决方案就会选择最佳选项。如果最佳选项是唯一的,则会选择该选项进行调用。如果没有拟合选项,或者有多个最佳匹配,这将是一个错误。
这种行为不是由重载解析规则引起的,而是由模板参数推导规则引起的。特别是归因于SFINAE(即替换失败不是错误)。
在模板参数推导中,编译器会尝试实例化您的函数,但如果输入参数t
没有成员函数dump
,它不会发出错误,而是会将其视为替换失败,因此不会实例化模板。
相关文章:
- 添加重载更改选择的重载
- 具有参数包和通用引用的重载选择
- 重载模板函数未为特定类型选择正确的版本
- 为什么选择转换运算符的重载?
- 为什么传递文字 3 会选择 int 重载而不是短重载?
- 模板函数重载(泛型类型与模板模板类型)选择正确的重载
- 为什么<iostream>运算符<<会选择明显错误的重载?
- C++:使用重载而不是动态强制转换通过基选择派生类
- 模板实例化失败:编译器选择不正确的重载函数
- 编译器选择错误的重载函数
- 为什么重载分辨率不选择模板函数的 std::vector 重载?
- 如何获取通过重载分辨率选择的函子签名
- 一种类型特征,标识哪个类提供通过重载解析选择的函数
- 当参数不同时,重载分辨率不会选择模板
- 为什么 lambda 自动和参数选择常量重载?
- 方括号和圆括号操作器,如何选择重载
- 常量表达式来自重载函数的选择
- 强制编译器选择常量运算符重载
- 是否在重载选择期间未考虑默认参数的转换
- 构造函数重载选择了强制转换运算符而不是结构类型