Если я удалю конструктор копирования и/или конструктор назначения копирования типа Bar,
Код: Выделить всё
struct Bar {
Bar() = default;
Bar(Bar const&) = delete;
};
Код: Выделить всё
std::optionalКод: Выделить всё
using T = std::optional;
static_assert(!std::is_copy_assignable_v);
Код: Выделить всё
using T = boost::optional;
static_assert(std::is_copy_assignable_v); // why doesn't this fail?
Код: Выделить всё
template
void foo() {
if constexpr (std::is_copy_assignable_v){
T lhs;
T rhs;
lhs = rhs;
} else {
std::cout
Я пишу универсальную библиотеку, основанную на блоке constexpr-if с std::is_assignable_v. Существует ли альтернативная черта типа, которую я могу использовать или написать самостоятельно, которая надежно работает для всех типов, включая boost::optional?
Изменить : ответ Джеффа Гаррета связан с проблемой шестилетней давности на странице boost::optional Github. Итак, это известная проблема, и быстрым решением было бы включить специальную обработку для boost::optional в мою библиотеку: https://godbolt.org/z/sdT6qdb4b
[code]template
struct is_copy_assignable : std::is_copy_assignable {};
template
struct is_copy_assignable
{
constexpr static bool value = std::is_copy_assignable_v && std::is_copy_constructible_v;
};
template
constexpr bool is_copy_assignable_v = is_copy_assignable::value;
Источник: https://stackoverflow.com/questions/781 ... stoptional
Мобильная версия