可变参数列表 null-terminated?

Is variadic arguments list null-terminated?

标题几乎完全涵盖了我的问题。对于某些上下文-从各种来源我知道可变参数函数应该具有签名,其中第一个参数提供有关传递了多少个参数的信息,但在玩了一下之后我发现 vs_arg 总是 returns nullptr 就在最后一个参数之后,因此这段代码运行良好(使用 MS Visual Studio):

void func(MClass *t_instance...) {
    std::va_list arguments;
    va_start(arguments, t_instance);
    for (MClass *instance = t_instance; instance != nullptr; instance = va_arg(arguments, MClass *)) {
        std::out << instance->name << std::endl;
    }
    va_end(arguments);
}

当然前提是没有 nullptr 作为参数传递,这是一个有效的假设吗?我找不到这个列表应该是 null-terminated,但也找不到相反的列表。

不,在最后一个参数处调用 va_arg 将 return 为空指针不是一个有效的假设。根据标准*,当没有剩余参数时调用 va_arg,即当它指向最后一个参数时,具有未定义的行为。据我所知,程序无法检查它何时处于最后一个参数,此信息必须通过其他方式提供。

* C++ 标准将 va_arg 的行为引用到 C 标准,该标准在第 7.16.1.1 节第 2 节中对此进行了定义。