Often times I find myself using std::pair to define logical groupings of two related quantities as function arguments/return values. Some examples: row/col, tag/value, etc.
I hate std::pair exactly for this reason. You never know which is which, and since access to first and second are public you can't enforce contracts either.