Does this mean that having a class satisfying these three conditions is deprecated?
Yes; if you have a destination-declaration-statement or user-declared destructor, you must also declare a copy constructor. This basically just means that your class should follow the Rule of Three (or Five or something else that it calls in C ++ 11).
It seems odd in itself that standardized behavior - in one go - is out of date.
The behavior is defined by the standard, because it was behavior in C ++ 03 - changing it would violate outdated code. Just as the standard defines the behavior (for example) of dynamic exception specifications, and also devalues them.
How does an example code introduced “in this way” have anything to do with the “last” case in italics?
This has nothing to do with the “last” case.
This is an illustration of a potential problem caused by the usual behavior defined by a sentence: there will be a conflict between the implicit declaration of the copy constructor and the user-declared constructor with default arguments, so that it can be called as the copy constructor.
Where is this "ambiguity"?
Consider the code:
X x1;
Should x2 initialized with a constructor declared by the user (with the second argument accepting the default value), or with a constructor with an implicit declaration? Both options are equally good to use. This is an ambiguity.
source share