[declval] stanowi:
Jeżeli funkcja ta jest ODR stosowane (3.2), program jest słabo formowane.
To w zasadzie to. W którym funkcje dotyczą, ODR wykorzystanie znaczy w [basic.def.odr]
funkcją którego nazwa pojawia się jako potencjalnie oceniano ekspresję ODR wykorzystywane jeśli jest unikalny wynik wyszukiwania, lub wybrany element zestawu przeciążonych funkcji (3.4, 13.3, 13.4), , chyba że jest to czysta funkcja wirtualna i albo jej nazwa nie jest jednoznacznie określona, albo wyrażenie tworzy jeden wskaźnik na element (5.3.1).
ale również:
wyrażenie jest potencjalnie oceniano chyba że jest unevaluated operandu (punkt 5) lub podwyrażenie nich.
A [dcl.type.simple]
Argument z decltype
specyfikacją jest unevaluated operandu (punkt 5).
Tak więc w decltype(std::declval<const void>)
, std::declval
nie jest potencjalnie oceniany i dlatego nie jest odr używany. Ponieważ jest to jedyne kryterium dla programu, który ma być źle sformułowany, a my go nie spotykamy, myślę, że libstdC++ nie jest odpowiedni do wysyłania statycznego asercji.
Chociaż nie sądzę, że jest to rzecz ++. Myślę, że to bardziej pytanie o to, kiedy zostaną wywołane static_assert
.LibstdC++ realizacja declval
jest.
template<typename _Tp>
struct __declval_protector
{
static const bool __stop = false;
static typename add_rvalue_reference<_Tp>::type __delegate();
};
template<typename _Tp>
inline typename add_rvalue_reference<_Tp>::type
declval() noexcept
{
static_assert(__declval_protector<_Tp>::__stop,
"declval() must not be used!");
return __declval_protector<_Tp>::__delegate();
}
Zarówno gcc i brzęk wyzwalacza że static_assert
w tym kontekście (ale oczywiście nie z decltype(std::declval<const void>())
, chociaż jesteśmy w unevaluated kontekście w obu wypadkach podejrzewam, że to błąd, ale może być po prostu niedookreślone w standardzie, co jest prawidłowe zachowanie w odniesieniu do wyzwalania static_assert
s.
Co próbujesz osiągnąć z tym? –
@SamVarshavchik, powód pytania wydaje się dość jasne z samego pytania. .. – SergeyA
Biorąc pod uwagę, że to ty zadajesz to pytanie, mam zerową pewność n moja odpowiedź. Ale i tak go wyrzuci. Czy "długie" przeciążenie w propozycji Nieblera dotyczy tylko obsługi cv-'void'? – Barry