Требуется выражение дает ошибку компиляции вместо false для std :: inistine_ptr в C ++ 20C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Требуется выражение дает ошибку компиляции вместо false для std :: inistine_ptr в C ++ 20

Сообщение Anonymous »

Я экспериментирую с концепциями C ++ 20 и требует выражения. Согласно стандарту, требуется выражение, должно проверить хорошо сформированность выражения и вернуть false , если выражение не является действительным, не вызывая ошибку компиляции.

Однако я столкнулся с следующим поведением с помощью std :: ulious_ptr на gcc и clang:

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

#include 

template 
inline constexpr bool is_dereferenceable_v = requires(T t) { *t; };

static_assert(!is_dereferenceable_v); // Should be fine
static_assert(is_dereferenceable_v);  // Also fails
demo
Ожидаемое поведение:

[*] Выражение *t не очень сформировано для std :: ulious_ptr (потому что dereferencing void * является инвазии). Требуется выражение должно вернуть false .
[*]

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

static_assert(!is_dereferenceable_v)
должен пройти. noexcept (*pointer) specifier.
* оба варианта static_assert , независимо от того, если бы он, по -видимому, проверяет это или false . /> Вопрос: < /strong>

это поведение является ошибкой в ​​GCC /Clang? Согласно стандарту, требуется { *t; } должен вернуть false для неверных выражений, а не вызывает ошибку компиляции.

Подробнее здесь: https://stackoverflow.com/questions/797 ... unique-ptr
Ответить

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

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

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

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

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