Skip to content

CWG2837 [class.copy.ctor] Issues with by-value copy constructors #474

@t3nsor

Description

@t3nsor

Full name of submitter: Brian Bi

Reference (section label): [class.copy.ctor], [namespace.udecl]

Issue description: [class.copy.ctor]/5 states:

A declaration of a constructor for a class X is ill-formed if its first parameter is of type cv X and either there are no other parameters or else all other parameters have default arguments. A member function template is never instantiated to produce such a constructor signature.

This wording does not explain what happens if such a constructor signature is inherited from a base class; MSVC currently treats the using-declaration as ill-formed (https://godbolt.org/z/6x47rf4vT). We should say that such a constructor is excluded from the inherited set.

Also, the wording "never instantiated" doesn't explain at what step of the process instantiation stops. I doubt there would be any implementation divergence, but even still, we should be a bit more explicit and say the result is a substitution failure.

Suggested resolution:

Add a paragraph before [namespace.udecl]/13:

The set of declarations named by a using-declarator that inhabits a class C does not include any constructor whose first parameter has type cv C and all of whose remaining parameters (possibly none) have default arguments.

Edit [class.copy.ctor]/5:

A declaration of a constructor for a class X is ill-formed if its first parameter is of type X and either there are no other parameters or else all other parameters have default arguments. A member function template is never instantiated to produce such a constructor signature. During type deduction for a constructor template of X ([temp.deduct.general]), if substitution produces such a constructor signature, type deduction fails.

In Example 5 to [class.copy.ctor]/5, edit the comment:

// does not instantiate the member template to produce S​::​S<S>(S); no S::S<S>(S) candidate generated from the member template;
// uses the implicitly declared copy constructor is used

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions