std::declval
Definido en el archivo de encabezado <utility>
|
||
template< class T > typename std::add_rvalue_reference<T>::type declval() noexcept; |
(desde C++11) (hasta C++14) (solo no evaluada) |
|
template< class T > std::add_rvalue_reference_t<T> declval() noexcept; |
(desde C++14) (solo no evaluada) |
|
Plantilla auxiliar para escribir expresiones que aparecen en contextos no evaluados, generalmente el operando de decltype
. En un contexto no evaluado, esta plantilla auxiliar convierte cualquier tipo T
(que puede ser un tipo incompleto) en una expresión de ese tipo, lo que permite utilizar funciones miembro de T
sin necesidad de pasar por constructores.
std::declval
solo se puede utilizar en contextos no evaluados y no es necesario definirla; es un error evaluar una expresión que contenga esta función. Formalmente, el programa está mal formado si esta función es usada en ODR.
Contenido |
[editar] Parámetros
(Ninguno)
[editar] Valor de retorno
No puede evaluarse y por lo tanto nunca devuelve un valor. El tipo de retorno es T&&
(se aplican las reglas de colapso de referencias), a menos que T
sea void (posiblemente calificado-cv), en cuyo caso el valor de retorno es T
.
[editar] Notas
std::declval
se usa comúnmente en plantillas donde los parámetros de plantilla aceptables pueden no tener un constructor en común, pero tienen la misma función miembro cuyo tipo de retorno se necesita.
[editar] Posible implementación
template<typename T> typename std::add_rvalue_reference<T>::type declval() noexcept { static_assert(false, "declval no permitido en un contexto evaluado"); } |
[editar] Ejemplo
#include <iostream> #include <utility> struct Default { int foo() const { return 1; } }; struct NonDefault { NonDefault() = delete; int foo() const { return 1; } }; int main() { decltype(Default().foo()) n1 = 1; // el tipo de n1 es int decltype(std::declval<Default>().foo()) n2 = 1; // igual // decltype(NonDefault().foo()) n3 = n1; // ERROR: no constructor por defecto decltype(std::declval<NonDefault>().foo()) n3 = n1; // el tipo de n3 es int std::cout << "n1 = " << n1 << '\n' << "n2 = " << n2 << '\n' << "n3 = " << n3 << '\n'; }
Salida:
n1 = 1 n2 = 1 n3 = 1
[editar] Véase también
Especificador decltype | Define un tipo equivalente al tipo de una expresión (C++11) |
(C++11) |
Deduce el tipo de retorno de una expresión de llamada a la función. (plantilla de clase) |