Re: template copy constructor vs normal copy constructor
Blanchet Florian wrote:
In article <i8q7vn$nq4$02$1@news.t-online.com>, Johannes Schaub (litb)
says...
A constructor is not necessarily a function. It can also be a template.
But you take the term "non-template constructor" and replace it by
"non-template function". These two are not equivalent.
In the IS, it's all about terms and the order they are presented in a
sentence. For example, "int &r;" is an object declaration. But it is not
the declaration of an object.
If "non-template constructor" is intended to mean something else than
"constructor that is not a template", I suggest the wording to be changed
to indicate the real intent. Or to at least put an explanatory note.
I know that terms are very important in the IS, but perhap's I
misunderstand the template terms. I'll try to well understand your
messages.
struct A
{
A() =default;
template<typename>
A(const A&);
};
template<>
A::A<char>(const A&) {std::cout << 0;}
int main()
{
A a;
A b = a;
system("PAUSE"); return 0;
}
So, (correct if I say wrong things), in this code, A::A<char> is a
template constructor ?
It is
- A function template specialization. We could call it a template function
since that's the term used by ARM and still by some, but not really by C++03
anymore.
- Not a function template. Therefor, from what the IS says I conclude it is
a "non-template constructor". It's a function, not a template.
The second A::A you declared is
- Not a function template specialization
- A function template. Therefor, from what the IS says I conclude it is a
"non-template constructor". It's a function, not a template.
I have to say I'm not quite sure about the exact meaning of "template
constructor" anymore. A::A<char> definitely is not a template. But likewise
is a "template function" not a template. Still "template" appears in the
term of "template function", but only to say that the function was generated
from / explicitly specified for a template.
I wouldn't want to bet on the exact meaning of "template constructor". I
just think that the "obvious" meaning is "A constructor that is not a
template".
And its first parameter is of type const A&, so
it's a copy constructor ?
Yes, using my above explanation I think that the IS says that A::A<char> is
a copy constructor.
But, when I try this code with gcc there is no
output. It's because this template constructor is declared (and define)
outside A ?
No, it is simply because the template cannot be called. How should it deduce
the template parameter of it? You have to give the parameter a default
argument (C++0x) to be able to call it.