its bearings). In C23, the second argument will no longer be required and variadic functions will no longer need a named parameter before the ellipsis. It initialises the object for use by or . The compiler will normally issue a warning if the reference is incorrect (e.g. a reference to a different parameter than the last one, or a reference to a wholly different object), but will not prevent compilation from completing normally. takes two arguments, a object (previously initialised) and a type descriptor. It expands to the next variable argument, and has the specified type. Successive invocations of allow processing each of the variable arguments in turn. Unspecified behavior occurs if the type is incorrect or there is no next variable argument. takes one argument, a object. It serves to clean up. If one wanted to, for instance, scan the variable arguments more than once, the programmer would re-initialise your object by invoking and then again on it. takes two arguments, both of them objects. It clones the second (which must have been initialised) into the first. Going back to the "scan the variable arguments more than once" example, this could be achieved by invoking on a first , then using to clone it into a second . After scanning the variable arguments a first time with and the first (disposing of it with ), the programmer could scan the variable arguments a second time with and the second . needs to also be called on the cloned before the containing function returns. In C# C# describes variadic functions using the keyword. A type must be provided for the arguments, although can be used as a catch-all. At the calling site, you can either list the arguments one by one, or hand over a pre-existing array having the required element type. Using the variadic form is Syntactic sugar for the latter. using System; class Program { static int Foo(int a, int b, params int[] args) { // Return the sum of the integers in args, ignoring a and b. int sum = 0; foreach (int i in args) sum += i; return sum; } static void Main(string[] args) { Console.WriteLine(Foo(1, 2)); // 0 Console.WriteLine(Foo(1, 2, 3, 10, 20)); // 33 int[] manyValues = new int[] { 13, 14, 15 }; Console.WriteLine(Foo(1, 2, manyValues)); // 42 } } In C++ The basic variadic facility in C++ is largely identical to