Неожиданное поведение std::is_copy_assignable и boost::optionalC++

Программы на C++. Форум разработчиков
Ответить
Гость
 Неожиданное поведение std::is_copy_assignable и boost::optional

Сообщение Гость »


Если я удалю конструктор копирования и/или конструктор назначения копирования типа Bar,

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

struct Bar {
Bar() = default;
Bar(Bar const&) = delete;
};

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

std::optional
нельзя назначать копированием.

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

using T = std::optional;
static_assert(!std::is_copy_assignable_v);
Это то, чего я ожидал. То же самое верно и для boost::optional, но, к сожалению, std::is_copy_assignable_v имеет значение true.

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

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
Ответить

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

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

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

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

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