c++ - 函数返回类型会影响重载的选择吗?

标签 c++ c++11

this帖子,建议使用以下方法来定义 operator<<定义 dump() 的所有类的函数成员函数:

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(替换失败不是错误),以便在声明对于实例化无效时删除重载。也就是说,当编译器尝试实例化上面的 operator<<() 时类型 T没有可访问的 dump(str)成员(member), decltype(t.dump(str))将无效。它没有失败,而是决定此重载不起作用并将其从候选重载集中删除。

一旦收集到候选项,过载决议就会选择最佳选项。如果最佳选项是唯一的,则选择它来调用。如果没有拟合选项或有多个最佳匹配,则会出错。

关于c++ - 函数返回类型会影响重载的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34179297/

相关文章:

c++ - 从另一个数组值初始化数组大小

c++ - 在 C++ 中合并两个库

c++ - 通过引用传递 Complex real 和 imag

c++ - C++11 及更高版本中的替代 STL 实现

C++ std::log 函数无法缩放

c++ - 如何使用 std::array 模拟 C 数组初始化 "int arr[] = { e1, e2, e3, ... }"行为?

c++ - boost::bind 到 std::lower_bound 可以工作,但 C++0x std::bind 无法编译

c++ - 在 C++ 中的 const 实例上调用非 const 函数,这可能吗?

c++ - 如何从原始指针获取 shared_ptr?

c++ - SDL 2,如何使用事件系统和异步绘制