Может ли nullptr использоваться как переменный аргумент (varargs)?
Могу ли я использовать ключевое слово nullptr
в качестве аргумента для переменной функции? Если да, то он подвергается какому-либо стандартным преобразованиям и каков тип результирующего значения?
Конкретно, верно следующее:
std::printf("%p", nullptr);
Или это должно быть:
std::printf("%p", static_cast<void *>(nullptr));
Ответы
Ответ 1
§5.2.2p7 Если параметр для данного аргумента отсутствует, аргумент передается таким образом, что получающая функция может получить значение аргумента, вызвав va_arg
(18.10).)... Аргумент, который имеет (возможно, cv-qualified) тип std::nullptr_t
, преобразуется в тип void*
(4.10)...
Ответ 2
В стандарте указано, что любой аргумент типа nullptr_t
будет преобразован в void*
при сопоставлении ...
. Таким образом, звонок правильный без актерского состава.
EDIT:
Из стандарта (§5.2.2/7):
Если для данного аргумента нет параметра, аргумент равен передается таким образом, что принимающая функция может получить значение аргумента, вызвав va_arg
. lvalue-to-rvalue, от массива до указателя и от функции к указателю стандартные преобразования выполняются по выражению аргумента. Аргумент, который имеет (возможно, cv-квалифицированный) тип std::nullptr_t
преобразуется в тип void*
.