Какие конструкторы должны быть определены, чтобы удовлетворить концепцию копирования для любого класса?C++

Программы на C++. Форум разработчиков
Anonymous
Какие конструкторы должны быть определены, чтобы удовлетворить концепцию копирования для любого класса?

Сообщение Anonymous »

Я хотел бы сделать класс, который удовлетворяет концепции std :: copy_constructible , и, кроме того, может быть построена из произвольного конструктивного значения копирования так же, как std :: any do:

#include

struct B {
B(std::copy_constructible auto);
};
static_assert(std::copy_constructible);

Но в отличие от std :: any шаблон конструктора B (std :: copy_constructible auto) получает свой аргумент по значению, а не ссылкой. Я ожидал, что на основе class.copy.ctor#5 такой конструктор никогда не подвергается созданию экземпляра для самого типа b . должен иметь неявно определенную копию и перемещение конструкторов, которые должны удовлетворить проверку концепции в утверждении. И действительно, GCC принимает программу просто отлично.

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

(8): error C2131: expression did not evaluate to a constant
(8): note: failure was caused by a read of an uninitialized symbol
< /code>
, а также Clang, что более ясно в его жалобах: < /p>
error: satisfaction of constraint 'constructible_from' depends on itself
note: while checking the satisfaction of concept 'copy_constructible' requested here
< /code>
К счастью, как MSVC, так и Clang могут быть счастливы, определяя 4 пользовательских интрукторов: < /p>
struct B {
B(const B&);
B(B&&);
B(B&);
B(const B&&);
B(std::copy_constructible auto);
};
static_assert(std::copy_constructible);
Онлайн демо: https://gcc.godbolt.org/z/rth33cmg3
Какую реализацию здесь правильная?
P>p.s. Существует связанный класс вопросов с шаблоном конструктора, требующий копируемых аргументов сама по себе не копируется, но речь идет о более простом предикате std :: is_copy_constructible_v и ошибку Clang, которая уже исправлена ​​в багажнике.

Подробнее здесь: https://stackoverflow.com/questions/795 ... pt-for-any

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