In [dcl.init]/17.6, it is explicitly written that for the case of parenthesis initialization, copy elision occurs:
If the initializer expression is a prvalue and the cv-unqualified version of the source type is the same class as the class of the destination, the initializer expression is used to initialize the destination object. [ Example: T x = T(T(T())); calls the T default constructor to initialize x. — end example ]
But in the case of list-initialization, for which the above paragraph does not apply, I did not find anything similar. See [dcl.init.list].
So why is there copy elision in this case: T x{T(T())};
according to the C++17 standard.