博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转发(forward) 出错的情况
阅读量:6540 次
发布时间:2019-06-24

本文共 1026 字,大约阅读时间需要 3 分钟。

1. forward 不支持初始化列表, 或者说, forward 无法推导多个参数的集合.

2. 一些编译器对于 static const val 的态度是直接替换, 如 static const val = 7; 那么, 对于函数 Func(val) 就等于 Func(7). 可是如果未定义的 static const val 传入模板并被 forward, 那么就可能会导致不可预知的错误.

3. 当尝试 forward 一个函数指针时, 如果该函数被重载, 那么就会出现错误, 因为模板无法确定传入哪个指针. 当然你如果任性, 非要传入某个已经被重载的函数指针, 那么最好传入它的别名.
4. 最后一个会导致 forward 失败的情况是, 当位域(bitfiled) 被用作函数的参数时:

struct IPv4Header{    std::uint_t version : 4                , IHL : 4                , DSCP : 6                , ECN : 2                , totalLength : 16;    ...};

设此有一个

IPv4Header h;

如果你是要直接转发 h.totalLength 那么是可以的. 但是, 如果是先把它作为参数传入以 T&& 作为函数参数的模板函数时, 就是另一回事了, 因为 h.totalLength 是个非常量位域(non-const bitfiled) 而函数参数则是一个引用. 在底层, 机器看待引用和指针实际是没有分别的, 所以无法使用引用或是指针去绑定任意二进制码. 所以一个绑定位域的指针是不存在的. 好的, 那么如果我就是任性, 非要转发一个位域, 该怎么办呢? 答案其实很简单, 只要过渡一下, 问题迎刃而解:

//先接住它auto length = static_cast
(h.totalLength);

总结:

forward 很厉害, 但不是万能的, 当模板类型推断失败, 或是推导出的类型不正确时它也会出错. 值得欣慰的是, 出错的情况是极少且可控的, 只要牢记并注意以上几种情况, 就不会跳进 forward 的坑. 就酱.

转载于:https://www.cnblogs.com/wuOverflow/p/4212356.html

你可能感兴趣的文章
BZOJ3994:[SDOI2015]约数个数和——题解
查看>>
BZOJ2115:[WC2011]Xor——题解
查看>>
Maven在dos窗口中的命令
查看>>
三重境界
查看>>
强制内容换行与不换行
查看>>
leetcode 76. Minimum Window Substring
查看>>
javascript判断对象是否为空
查看>>
窗口设置
查看>>
【转载】实用VC++6.0插件
查看>>
Oracle 行转列(不固定行数的行转列,动态)(转)
查看>>
three20 network
查看>>
用备份控制文件做不完全恢复下的完全恢复(全备<老>--备份控制文件<次新>--新建表空间andy--日志文件<新>)...
查看>>
实验报告
查看>>
GSON工具类
查看>>
taobao
查看>>
Dijkstra算法的C语言程序
查看>>
HDU4706 Children's Day
查看>>
实验五感想
查看>>
简单练习题
查看>>
iOS网络编程笔记——GCDAsyncSocket使用
查看>>