The expression myclass()
is explicit type conversion using functional notation, per [expr.type.conv]/1:
A simple-type-specifier or typename-specifier followed by a
parenthesized optional expression-list or by a braced-init-list (the
initializer) constructs a value of the specified type given the
initializer [..]
Here, the simple-type-specifier myclass
is followed by parenthesized expression-list ()
with an empty initializer-list. This expression constructs a value of type myclass
from the empty initializer-list.
So you might ask, Is that constructed value is prvalue or xvalue or lvalue. So here we've to invoke the immediately next paragraph: [expr.type.conv]/2:
If the initializer is a parenthesized single expression, the type
conversion expression is equivalent to the corresponding cast
expression. Otherwise, if the type is cv void
and the initializer is
()
or {}
(after pack expansion, if any), the expression is a prvalue
of the specified type that performs no initialization. Otherwise, the
expression is a prvalue of the specified type whose result object is
direct-initialized with the initializer.
Our initializer is empty initializer-list, and the type is not cv void
, so we've ended with the sentence that says:
Otherwise, the expression is a prvalue of the specified type whose
result object is direct-initialized with the initializer.
Hence, the expression myclass()
is a prvalue, whose result object is direct-initialized, from the empty initializer-list, by calling the default constructor.