Il seguente codice innesca un'asserzione statico sul libstdC++:È consentito utilizzare decltype su std :: declval <T> (la funzione stessa, non il risultato della chiamata)?
#include <utility>
using t = decltype(std::declval<const void>);
Dovrebbe?
La motivazione per questa domanda:
Il seguente declval
implementazione proposed by Eric Niebler (che è apparentemente un ottimizzazione del tempo di compilazione)
template<typename _Tp, typename _Up = _Tp&&>
_Up __declval(int);
template<typename _Tp>
_Tp __declval(long);
template<typename _Tp>
auto declval() noexcept -> decltype(__declval<_Tp>(0));
sarebbe discutibile se un utente potrebbe legalmente osservare il tipo di std::declval<const void>
. La firma nello standard
template <class T>
add_rvalue_reference_t<T> declval() noexcept;
risultati nel tipo const void()
(o const void() noexcept
in C++ 17), considerando che gli risultati versione del tipo void()
(o void() noexcept
).
Cosa stai cercando di ottenere con questo? –
@ SamVarshavchik, il motivo della domanda sembra abbastanza chiaro dalla domanda stessa. .. – SergeyA
Dato che sei tu a fare questa domanda, ho zero fiducia in me n la mia risposta. Ma buttarlo fuori comunque. Il sovraccarico 'lungo? Nella proposta di Niebler è sufficiente per gestire cv-'void'? – Barry