Какие конструкторы должны быть определены, чтобы удовлетворить концепцию копирования для любого класса?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
Ответить

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

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

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

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

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