Reading the documentation I just linked to, it says std::tie() makes a std::tuple of references. Once your std::array goes out of scope, wouldn't those references would be invalid?
Whereas std::make_tuple() copies the values, so the tuple owns it's own arrays.
To get rid of the copy, you could even use std::move():
return std::make_tuple(std::move(buff), std::move(buff2)); //I don't know if the std::move()s are done automatically be the compiler.
This is assuming that 'buff' and 'buff2' are never used again, like in your example.
If the two std::arrays continue to exist after the function ends, say, as member-variables of a class, then the std::tie() version that takes references would be valid as long as the class holding the real value is valid.
Am I missing something here?