-
Notifications
You must be signed in to change notification settings - Fork 7
Description
Full name of submitter (unless configured in github; will be published with the issue): Jiang An
Reference (section label): [basic.life], [stmt.dcl]
Link to reflector thread (if any):
Issue description:
The current definition of term "vacuous initialization" was established by CWG2256, which predated P0848R3. As of C++20/P0848R3, a class may have a trivial but not eligible default constructor, while default-initialization for a variable of such a class can still call a non-trivial default constructor. Presumably we don't want to say such a variable has vacuous initialization.
E.g. the following example should be ill-formed and implementations seem to agree:
template<int N>
struct ConditionallyTrivial {
ConditionallyTrivial() requires (N >= 0) = default;
ConditionallyTrivial() requires (N < 0) {}; // non-trivial
};
int main() {
goto main_end;
ConditionallyTrivial<-1> x;
main_end:;
}
On the other hand, as of CWG2256, the term "vacuous initialization" is only essentially used in [stmt.dcl] and doesn't need to be mentioned in [basic.life]. It seems that we can dissolve the term into [stmt.dcl].
Suggested resolution:
Modify [basic.life] as indicated:
- The lifetime of an object or reference is a runtime property of the object or reference.
A variable is said to have vacuous initialization if it is default-initialized and, if it is of class type or a (possibly multidimensional) array thereof, that class type has a trivial default constructor.The lifetime of an object of typeT
begins when:
- (1.1) storage with the proper alignment and size for type
T
is obtained, and- (1.2) its initialization (if any) is complete
(including vacuous initialization)([dcl.init]),[...]
Modify [stmt.dcl] as indicated:
- [...]; unless all such variables
have vacuous initialization ([basic.life])are default-initialized ([dcl.init.general]) and no constructor other than trivial default constructors ([class.default.ctor]) is called in their initialization, the transfer of control shall not be a jump. [...]