因此,当没有参数(via )传递时,显然将std::nullptr_t参数转换为类型的空指针void *(N3337的第5.2.2/7节...).这意味着要正确传递空char *指针,例如,仍然需要强制转换:
some_variadic_function("a","b","c",(const char*)std :: nullptr);
因为不能保证null void *具有与null 相同的位模式char *.正确?
这也意味着,没有任何优势,以std::nullptr过度0在这种情况下,除非是清晰.
小智 7
你问:
因为不能保证null
void *具有与null 相同的位模式char *.正确?
嗯,实际上,这种保证确实存在,Deduplicator的答案已经显示了标准要求的地方.但这与你的问题无关.
传递void *给可变参数函数并使用va_argas 访问它char *特别允许作为特殊例外.
C++ 11:
18.10其他运行时支持[support.runtime]
1标题
<csetjmp>(非本地跳转),<csignal>(信号处理),<cstdalign>(对齐),<cstdarg>(可变参数),<cstdbool>(__bool_true_false_are_defined).(运行时环境getenv(),system()),和<ctime>(系统时钟clock(),time())提供与C语言代码进一步的兼容性.2这些标头的内容是一样的标准C库头
<setjmp.h>,<signal.h>,<stdalign.h>,<stdarg.h>,<stdbool.h>,<stdlib.h>,和<time.h>分别具有以下变化:[......没什么
va_arg]
C99:
7.15.1.1
va_arg宏[...]如果没有实际的下一个参数,或者type与实际的下一个参数的类型不兼容(根据默认参数提升而提升),则行为是未定义的,除了以下情况:
- 一种类型是有符号整数类型,另一种类型是相应的无符号整数类型,并且该值可在两种类型中表示;
- 一种类型是指向void的指针,另一种是指向字符类型的指针.
但是,这确实意味着在其他两种类型T1并且T2具有相同的表示和对齐要求的情况下,如果将行为T1传递给可变参数函数,则行为是未定义的,并且将其检索为T2.
这样的一个例子:使(void *) 0和访问它作为char *被允许,传递(void *) 0并访问它作为unsigned char *也是允许的,但传送(char *) 0和访问它作为unsigned char *是不允许的.如果编译器能够内联对可变参数函数的调用,并根据标准的严格要求进行优化,那么这种不匹配可能会严重破坏.
这也意味着,没有任何优势,以
std::nullptr过度0在这种情况下,除非是清晰.
我绝对不会在nullptr没有投射的情况下使用它,即使在这个特殊情况下它是有效的.很难看出它是有效的.如果包含强制转换,(char *) 0则与空指针值一样清晰.
| 归档时间: |
|
| 查看次数: |
358 次 |
| 最近记录: |