SFINAE是否适用于功能体
Does SFINAE apply to function bodies?
我有以下示例代码:
class Serializable {};
class MyData : public Serializable {};
void GetData( Serializable& ) {}
template<typename T>
void GetData( T& data )
{
std::istringstream s{"test"};
s >> data;
}
int main()
{
MyData d;
GetData(d);
}
(现场样本(
根据重载解析规则,应首选非模板版本,因为基类的类型为 Serializable
。但是,我希望 SFINAE 在实例化重载解析时模板版本中出现错误时会启动(因为如果没有为类型定义>> 运算符,则不应考虑它(。
为什么即使不使用模板,它仍然失败?
根据重载解析规则,非模板版本应为 首选,因为基类的类型为
Serializable
。
差一点。[over.match.best]:
根据这些定义,一个可行的函数
F1
被定义为 比另一个可行的函数更好的函数F2
对于所有参数 i, ICSi(F1( 不是比 ICSi(F2( 更糟糕的转换序列,然后
- 对于某些参数 j,ICSj(F1( 是比 ICSj(F2( 更好的转换序列,或者,如果不是这样,
- [...]
F1
不是函数模板专用化,F2
是函数模板专用化 [...]
这意味着,仅当函数模板的推导专用化需要的转换不优于普通函数所需的转换时,您的规则才适用。d
与 Serializable&
的绑定比 d 与 MyData&
的绑定(这是专用化参数的类型(的转换更糟糕,[over.ics.ref]:
当引用类型的参数直接绑定 (8.5.3( 到 参数表达式,隐式转换序列是恒等式 转换,除非参数表达式的类型为 参数类型的派生类,在这种情况下为隐式 转换序列是派生到基础的转换 (13.3.3.1(。
但是,我希望SFINAE在 实例化以解决重载时的模板版本 (因为如果未为类型定义>>运算符,则不应 被考虑(。
SFINAE 不适用于函数模板的内容。[温度扣除]/8:
仅 函数类型及其模板参数类型可能会导致 演绎失败。
因此,确实选择了函数模板的推导专用化,并在实例化其定义时导致编译器错误。
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 删除功能不适用于串行通信后多个循环中的多个实例
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- Xcode 6 的 Playground 功能适用于 Visual Studio 或其他使用 C++ 的 IDE?
- 适用于Windows XP的版本帮助程序功能
- HoG功能仅适用于块