Ich experimentiere mit C ++ 20-Konzepten und erfordert Ausdrücke. STD :: Unique_ptr auf gcc und klang:
Code: Select all
#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
Erwartete Verhalten:
[*] Der Ausdruck *t ist nicht gut geformt für std :::Riadium_ptr (weil derferencing void * is usw. ist. Expression
sollte falsch .
zurückgeben
Code: Select all
static_assert(!is_dereferenceable_v)
sollte passieren. noexcept (*pointer) Spezifizierer. /> Frage: < /strong>
Ist dieses Verhalten ein Fehler in GCC /Clang? Nach dem Standard benötigt { *t; } sollte false für ungültige Ausdrücke zurückgeben, anstatt einen Kompilierungsfehler zu verursachen.
Ich experimentiere mit C ++ 20-Konzepten und erfordert Ausdrücke. STD :: Unique_ptr auf gcc und klang:
[code]#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
[/code]
Demo
[b] Erwartete Verhalten: [/b]
[*] Der Ausdruck *t ist nicht gut geformt für std :::Riadium_ptr (weil derferencing void * is usw. ist. Expression [b] sollte falsch [/b].
zurückgeben[code]static_assert(!is_dereferenceable_v)[/code] sollte passieren. noexcept (*pointer) Spezifizierer. /> Frage: < /strong>
Ist dieses Verhalten ein Fehler in GCC /Clang? Nach dem Standard benötigt { *t; } sollte false für ungültige Ausdrücke zurückgeben, anstatt einen Kompilierungsfehler zu verursachen.