Używam prostego SFINAE podstęp, by sprawdzić, czy funkcja członek nie istnieje, tak jak poniżej:Clang narzeka niezdefiniowanej funkcji constexpr w unevaluated kontekście
#include <type_traits>
template <typename C>
struct has_size {
template <typename T>
static constexpr auto check(T*) ->
decltype(std::declval<T const>().size(), std::true_type{});
template <typename>
static constexpr auto check(...) -> std::false_type;
static constexpr bool value = decltype(check<C>(nullptr))::value;
};
// Usage:
static_assert(has_size<std::vector<int>>::value, "std::vector<int> has size()");
(Jestem świadomy, że there’s a simpler method teraz, ale nie był” t kiedy napisałem ten fragment kodu.)
Ten kod działa na GCC. jednak dzyń emituje ostrzeżenie (wszystkie wersje górę do Apple LLVM 7.3, w zależności od tego, który jest w górę):
decltype.cpp:15:27: error: inline function 'has_size<std::__1::vector<int, std::__1::allocator<int> > >::check<std::__1::vector<int, std::__1::allocator<int> > >' is not defined [-Werror,-Wundefined-inline]
static constexpr auto check(T*) ->
^
decltype.cpp:22:44: note: used here
static constexpr bool value = decltype(check<C>(nullptr))::value;
Innymi słowy, dzyń oczekuje, że funkcje, które zostaną określone, nie tylko ogłosił, mimo że są one nigdy nie nazywane (tylko w nieocenionym kontekście decltype
).
Czy to błąd w klangu? Czy też słuszne jest narzekanie? Jeśli tak, czy GCC jest również poprawny w akceptowaniu tego kodu?
Ponadto, pisząc to pytanie, zdałem sobie sprawę, że można całkowicie uniknąć błędu kompilacji klang poprzez usunięcie kwalifikatora constexpr
przed szablonem funkcji członka. Co zmienia się tutaj obecność constexpr
?
Jaki jest problem jak ja kompilacji z -Werror
. Istnieją pewne ostrzeżenia, które są oparte na heurystyce i dlatego mają nieuniknione fałszywe alarmy, ale tak nie jest, o ile widzę.
Tak, całkowicie się zgadzam. Fakt, że wykonałem te funkcje "constexpr", nie ma żadnego sensu. Byłem po prostu zaskoczony, że z pozoru zmienia się sposób, w jaki widzi je nieuwarunkowany kontekst. –