cplusplus / CWG

Core Working Group
23 stars 7 forks source link

CWG2871 [class.default.ctor] p1 should cover the constructor template #510

Open xmh0511 opened 4 months ago

xmh0511 commented 4 months ago

Full name of submitter (unless configured in github; will be published with the issue): Jim X

[class.default.ctor] p1 says:

If there is no user-declared constructor for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted ([dcl.fct.def]).

Consider this example:

struct X{
  template<class U> X(U){} // #2
};
int main(){
   X x;  // #1
}

#1 is ill-formed since no matching function for call to 'X::X()'. [class.default.ctor] p1 should cover this example, however, #2 is a user-declared constructor template, and the implicitly instantiated declaration is not user-declared anyway.

Suggested Resolution

If there is no user-declared constructor or constructor template for class X, a non-explicit constructor having no parameters is implicitly declared as defaulted ([dcl.fct.def]).

jensmaurer commented 3 months ago

CWG2871

lprv commented 3 months ago

There are plenty of other uses of the undecorated term 'constructor' in the standard that are clearly meant to include templates: [basic.scope.scope]/4, [dcl.init.aggr]/1.1, [namespace.udecl]/2 and /13, [class.mem.general]/22, various subclauses of [over.match.funcs], etc. Why is it a problem in this particular case?

frederick-vs-ja commented 3 months ago

There are plenty of other uses of the undecorated term 'constructor' in the standard that are clearly meant to include templates: [basic.scope.scope]/4, [dcl.init.aggr]/1.1, [namespace.udecl]/2 and /13, [class.mem.general]/22, various subclauses of [over.match.funcs], etc. Why is it a problem in this particular case?

Most are about inheriting constructors. I think there should be a concentrated issue on this.