So the goal is renaming/aliases? Other question is why you need pair there?
It does not have much of functionality. Just relational operators and
'swap'.
The references are bad for renaming/aliasing because these take some memory.
Your derived objects will be bigger. It is better to use short accessory
functions for such aliases. Sort of like:
struct Vertex
{
float first() const { return values[0]; }
float second() const { return values[1]; }
float third() const { return values[2]; }
float x() const { return values[0]; }
float y() const { return values[1]; }
float z() const { return values[2]; }
float operator [] (int i) const { return values[i]; }
float& operator [] (int i) { return values[i]; }
float[3] values;
};
The short member function calls will be usually optimized out by
compiler.