#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 .
Код: Выделить всё
BКод: Выделить всё
(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);
Какую реализацию здесь правильная?
P>p.s. Существует связанный класс вопросов с шаблоном конструктора, требующий копируемых аргументов сама по себе не копируется, но речь идет о более простом предикате std :: is_copy_constructible_v и ошибку Clang, которая уже исправлена в багажнике.
Подробнее здесь: https://stackoverflow.com/questions/795 ... pt-for-any
Мобильная версия