Espacios de nombres
Variantes
Acciones

std::declval

De cppreference.com
< cpp‎ | utility
 
 
Biblioteca de servicios
Servicios generales
Operadores relacionales (en desuso en C++20)
 
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)[editar]
(C++11)
Deduce el tipo de retorno de una expresión de llamada a la función.
(plantilla de clase) [editar]