Оператор присваивания вызывает создание экземпляра шаблона конструктораC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оператор присваивания вызывает создание экземпляра шаблона конструктора

Сообщение Anonymous »

Он сообщает мне, что происходит переопределение Get при вызове оператора присваивания.
https://godbolt.org/z/xYWbrvEPG

Код: Выделить всё

template
struct Reader {
friend consteval auto Get(Reader);
};

template
struct Writer {
friend consteval auto Get(Reader) { return U{}; }
};

auto Lambda = [] {};

template
struct Instance {
template
Instance(T) { }

void operator=(Instance const&) {}
};

int main() {
Instance         first(5);
Instance second(1.2);
first = second;
}

Код: Выделить всё

: In instantiation of 'struct Writer':
:17:50:   required by substitution of 'template Instance::Instance(T) [with T = Instance; auto  = ]'
17 |     template
|                                                  ^
:26:13:   required from here
26 |     first = second;
|             ^~~~~~
:10:27: error: redefinition of 'consteval auto Get(Reader)'
10 |     friend consteval auto Get(Reader) { return U{}; }
|                           ^~~
:10:27: note: 'consteval auto Get(Reader)' previously declared here
Очевидно, в этой строке создается экземпляр конструктора, который оценивает аргумент по умолчанию во второй раз, вызывая переопределение. Я не понимаю, зачем это делать, ведь нет необходимости преобразовывать правую часть, поскольку имеется точное совпадение.
Если оператор= заменяется обычной функцией-членом, эта ошибка исчезает.

Подробнее здесь: https://stackoverflow.com/questions/798 ... r-template
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»