gpt4 book ai didi

c++ - 可变参数函数中的 std::nullptr_t 参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:29 25 4
gpt4 key购买 nike

显然 std::nullptr_t 参数在没有参数传递时被转换为 void * 类型的空指针(N3337 的第 5.2.2/7 节) (通过 ...)。这意味着要正确传递空 char * 指针,例如,仍然需要强制转换:

some_variadic_function("a", "b", "c", (const char *) std::nullptr);

因为无法保证空 void * 与空 char * 具有相同的位模式。正确吗?

这也意味着在这种情况下,std::nullptr0 没有任何优势,除非为了清楚起见。

最佳答案

你问:

since there is no guarantee that a null void * has the same bit pattern as a null char *. Correct?

嗯,实际上,这种保证确实存在,Deduplicator 的回答已经表明了标准要求这样做的地方。但这与您的问题无关。

传递 void *到可变参数函数,并使用 va_arg 访问它作为char * , 作为特殊异常(exception)被特别允许。

C++11:

18.10 Other runtime support [support.runtime]

1 Headers <csetjmp> (nonlocal jumps), <csignal> (signal handling), <cstdalign> (alignment), <cstdarg> (variable arguments), <cstdbool> (__bool_true_false_are_defined). (runtime environment getenv(), system()), and <ctime> (system clock clock(), time()) provide further compatibility with C code.

2 The contents of these headers are the same as the Standard C library headers <setjmp.h>, <signal.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stdlib.h>, and <time.h>, respectively, with the following changes:

[... nothing about va_arg]

C99:

7.15.1.1 The va_arg macro

[...] If there is no actual next argument, or if type is not compatible with the type of the actual next argument (as promoted according to the default argument promotions), the behavior is undefined, except for the following cases:

-- one type is a signed integer type, the other type is the corresponding unsigned integer type, and the value is representable in both types;

-- one type is pointer to void and the other is a pointer to a character type.

但是,这确实意味着在其他情况下两种类型 T1T2具有相同的表示和对齐要求,如果 T1 则行为未定义被传递给一个可变参数函数,它被检索为 T2 .

例如:传递 (void *) 0并以 char * 的形式访问它, 允许, 通过 (void *) 0并以 unsigned char * 的形式访问它也是允许的,但传递 (char *) 0并以 unsigned char * 的形式访问它不允许。如果编译器能够内联对可变参数函数的调用,并根据标准的严格要求进行优化,则此类不匹配可能会严重中断。

This also means that there is no advantage to std::nullptr over 0 in such cases, except perhaps for clarity.

我肯定不会使用nullptr没有转换它,即使在这种特殊情况下它是有效的。很难看出它是有效的。如果无论如何都包含类型转换,(char *) 0就像空指针值一样清晰。

关于c++ - 可变参数函数中的 std::nullptr_t 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23373742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com