this workaround doesn't look efficient
It is. It takes an lvalue reference (a scalar value) and passes that to vec. It is marginally less efficient than vec( substr( ... ), ... );, but not so much that you would be able to detect it.
However, substr can only provide an lvalue for byte-sized units; where vec can provide an lvalue for 8 byte units.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.