Yeah, in generic code, the standard, non-universal syntax, will be used. The point was for regular, simple uses (and users...).
As for, do we need access of structs by index - this will allow code written against a tuple to accept a struct also.
An algorithm can be written against a generic "type with this number of fields of this and this type" without care what the containing type is.
There is already such symmetry b/w pair, tuple and array and I think it is a good thing.
The idea is, this access to be for types (not only pt-s) what iterators are to containers - the real type of the container does not matter for the access.
Having said that, to have this as default for every possible type is probably not a good idea, still, easy adaptors should be possible.
In any case. This is not the core of the proposal !
The core is - to have native access for tuples and, for the time being, until a build-in type, for variant as well.
The reason is, tuple access will not change - be it build-in or library, it will always be access pretty much the same way - either by integer or type index.
Considering it is a core "vocabulary" type now, the awkward way it is access is quite glaring. Especially for a new comer.
After all, the tuple is not just for template metaprogrammers - it is as basic a s struct, arguably even more basic!
Considering tuple is here to stay, its access should be promoted to a language feature, so new comers can get a feel for it more easily.
(Again, no matter the impl. of tuple, the access will be the same)
That is the reason for the proposed syntax as well - the mix of two basic expressions which are learned in the first week (probably).
Dot means - dig into a struct to get a contained object
A number surrounded with square brackets means "index", note, not just in C/C++ but in other, non-programming places like Wikipedia page references and others.
Combined, dot and number-in-beckets, just mean dig into "a struct" and pick at this index.
(The user should not think much about templates at this point - even if told what template is, he will be told in the context of tuple<int, string> or vector<int>,
not in the context of passing is as an argument to a function, which is weird even in normal, day to day c++!)
Lastly, in the context of the fancy structured bindings, the lack of a native way to pick just one element is simply sad.