Я пробовал эту программу с GCC и Clang, но оба ничего не выводят
#include <iostream>
struct A {
A(){}
template<typename T>
A(T &) {
std::cout << "copied!";
}
};
void f(...) { }
int main() {
A a;
f(a);
}
Согласно моим стандартам, эта программа должна выводить "copied!"
, Может кто-нибудь сказать мне, ошибаюсь ли я, или это ошибка в этих двух компиляторах?
Казалось бы, что вы ожидаете, это поведение, определенное стандартом.
Функции шаблона не препятствуют созданию конструкторов копирования / операторов присваивания. Таким образом, функции шаблона не препятствуют тому, чтобы класс считался «легко копируемым». Однако они делать участвовать в разрешении перегрузки, когда наступает время их фактически копировать, чтобы они могли вмешиваться. И с тех пор a
в этом примере это неконстантное l-значение, оно лучше соответствует сигнатуре A(A&)
чем это A(const A&)
, Так что это вызывает функцию шаблона.
(Хотя почему вы не удосужились объяснить все это в своем вопросе, ускользает от меня, поскольку вы, очевидно, провели свое исследование.)
Однако, учитывая, насколько это малый угол, я бы не стал полагаться на это поведение, чтобы заставить тривиально копируемые классы не копироваться тривиально.
Других решений пока нет …