If you define a function foo( string str, mixed *args... ), and call it with foo( "bar" ), args will be ({ }). Calling it with foo( "baz", 2, "frog" ), args will be ({ 2, "frog" }). Having int *moo = ({ 1, 2, 3, 4, 5 }), and calling foo( "burp", moo ) will have args as ({ ({ 1, 2, 3, 4, 5 }) }), while foo( "?", moo... ) will make args ({ 1, 2, 3, 4, 5 }).