题 nullptr可以用作变量参数(varargs)吗?


我可以用吗? nullptr 关键字作为变量函数的参数?如果是这样,它是否经历任何类型的标准转换,结果值的类型是什么?

具体来说,以下是正确的吗?

std::printf("%p", nullptr);

或者它必须是:

std::printf("%p", static_cast<void *>(nullptr));

20
2017-09-11 13:18


起源


nullptr 有类型的 nullptr_t,不是吗?任何关于转换的想法都应该从那里开始。 - Bartek Banachewicz
@BartekBanachewicz:我知道,但我找不到将该类型与省略号相关的规则。我正在寻找标准转换,并且从未检查过函数调用的部分。 - Kerrek SB
Downvoter,小心解释你的反对意见? - Kerrek SB


答案:


§5.2.2p7 当给定参数没有参数时,参数的传递方式使得接收函数可以通过调用获取参数的值 va_arg (18.10)......具有(可能是cv-qualified)类型的参数 std::nullptr_t 转换为类型 void* (4.10)...


22
2017-09-11 13:23



很好,我一直在寻找。谢谢! - Kerrek SB
+1,我的Standard-fu有点生疏了。 - Bartek Banachewicz
一世 最后 发现它,然后回到6个答案:p - chris


标准说任何类型的论证 nullptr_t 将被转换为 void* 匹配时 ...。所以没有演员,这个电话是正确的。

编辑:

从标准(§5.2.2/ 7):

当给定参数没有参数时,参数为   以这样一种方式传递,即接收功能可以获得   通过调用参数的值 va_arg。该   左值到右值,数组到指针和函数到指针   标准转换是在参数表达式上执行的。   具有(可能是cv-qualified)类型的参数    std::nullptr_t 转换为类型 void*


11
2017-09-11 13:22