Created on 2012-10-19.00:00:00 last changed 147 months ago
struct Silly
{
template<class... Ts>
Silly(Ts&&...)
{}
};
int main()
{
Silly s;
Silly t(s); // Silly::Silly(Ts &&...) [Ts = <Silly &>]
const Silly u;
Silly v(u); // calls Silly::Silly(Silly const&)
}
The problem is that users expect the copy constructor to be called in both situations.
Note: you do not need variadics for this; it made the example smaller. Also, this issue existed in C++03, but rarely happened in practice because templated parameters were usually declared const T&.
Bristol 2013: Sutton and Gregor proposed various work-arounds, like additional overloads and constraints. Stroustrup asked whether having a copying template have different semantics from a copy constructor isn't an error, and Gregor explained that tuples run into that issue and they have different semantics for the template. The submitter is encouraged to write a paper, and practical examples are desirable.
The EWG decided to close this issue as a NAD in Chicago 2013.
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2013-10-11 23:34:25 | admin | set | status: open -> nad |
| 2012-10-19 00:00:00 | admin | create | |