Передача объекта класса с тривиальным конструктором копирования, но без вывода?

Я пробовал эту программу с GCC и Clang, но оба ничего не выводят

#include <iostream>

struct A {
A(){}

template<typename T>
A(T &) {
std::cout << "copied!";
}
};

void f(...) { }

int main() {
A a;
f(a);
}

Согласно моим стандартам, эта программа должна выводить "copied!", Может кто-нибудь сказать мне, ошибаюсь ли я, или это ошибка в этих двух компиляторах?

8

Решение

Казалось бы, что вы ожидаете, это поведение, определенное стандартом.

Функции шаблона не препятствуют созданию конструкторов копирования / операторов присваивания. Таким образом, функции шаблона не препятствуют тому, чтобы класс считался «легко копируемым». Однако они делать участвовать в разрешении перегрузки, когда наступает время их фактически копировать, чтобы они могли вмешиваться. И с тех пор a в этом примере это неконстантное l-значение, оно лучше соответствует сигнатуре A(A&) чем это A(const A&), Так что это вызывает функцию шаблона.

(Хотя почему вы не удосужились объяснить все это в своем вопросе, ускользает от меня, поскольку вы, очевидно, провели свое исследование.)

Однако, учитывая, насколько это малый угол, я бы не стал полагаться на это поведение, чтобы заставить тривиально копируемые классы не копироваться тривиально.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]