【问题标题】:Can nullptr be used as a variable argument (varargs)?nullptr 可以用作变量参数(varargs)吗?
【发布时间】:2013-09-15 13:04:15
【问题描述】:

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

具体来说,下面的说法正确吗?

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

还是必须这样:

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

【问题讨论】:

  • nullptr 的类型是 nullptr_t,不是吗?任何关于转化的想法都应该从这里开始。
  • @BartekBanachewicz:我知道,但我找不到将该类型与省略号相关联的规则。我正在查看标准转换,从未检查过函数调用部分。
  • 投反对票的人,想解释一下你的反对意见吗?

标签: c++ c++11 type-conversion nullptr


【解决方案1】:

标准规定任何nullptr_t 类型的参数在匹配... 时都将转换为void*。因此,没有演员表的调用是正确的。

编辑:

来自标准(§5.2.2/7):

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 太好了,我正在寻找那个。谢谢!
    • +1,我的标准版有点生锈了。
    • 终于找到它,然后回到 6 个答案:p
    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多