Share via


especificador de tipo decltype

El especificador de tipo de decltype hace que el tipo de una expresión especificada.El especificador de tipo de decltype , así como palabra clave auto, es útil principalmente a los programadores que escriben las bibliotecas de la plantilla.Uso auto y decltype de declarar una función de plantilla cuyo tipo de valor devuelto depende de los tipos de sus argumentos.O, utilice auto y decltype declarar una función de plantilla que contenga una llamada a otra función y, a continuación devuelve el tipo de valor devuelto de la función ajustada.

 decltype( expression )

Parámetros

Parámetro

Descripción

expression

Expresión.Para obtener más información, vea Expresiones (C++).

Valor devuelto

Tipo del parámetro expression.

Comentarios

Admiten en Visual C++ 2010 o versiones posteriores, y se puede utilizar el especificador de tipo de decltype con código nativo o código administrado.

El compilador usa las reglas siguientes para determinar el tipo de parámetro de expression .

  • Si el parámetro de expression es un identificador o acceso a miembros de clase, decltype(expression) es el tipo de entidad denominada por expression.Si no existe esta entidad o los nombres de parámetro de expression un conjunto de funciones sobrecargadas, el compilador produce un mensaje de error.

  • Si el parámetro de expression es una llamada a una función o una función sobrecargada de operador, decltype(expression) es el tipo de valor devuelto de la función.paréntesis alrededor de un operador sobrecargado se omiten.

  • si el parámetro de expression es rvalue, decltype(expression) es el tipo de expression.Si el parámetro de expression es l, decltype(expression) es referencia de valor l al tipo de expression.

El ejemplo de código siguiente se muestran algunos usos del especificador de tipo de decltype .Primero, suponga que ha codificado las siguientes instrucciones.

int var;
const int&& fx(); 
struct A { double x; }
const A* a = new A();

A continuación, examina los tipos devueltos por las cuatro instrucciones de decltype en la tabla siguiente.

Instrucción

Tipo

Notas

decltype(fx());

const int&&

referencia rvalue a const int.

decltype(var);

int

el tipo de variable var.

decltype(a->x);

double

El tipo de acceso de miembro.

decltype((a->x));

const double&

Paréntesis internos hacen que la instrucción que se evalúe como una expresión en lugar de un acceso de miembro.y porque a se declara como puntero de const , el tipo es una referencia a const double.

Decltype y automático

Usar el especificador de tipo de decltype , junto con la palabra clave de auto , declarar una función de plantilla cuyo tipo de valor devuelto depende de los tipos de sus argumentos.Por ejemplo, considere el ejemplo de código siguiente en el que el tipo de valor devuelto de la función de plantilla depende de los tipos de los argumentos.En el ejemplo de código, el marcador de DESCONOCIDO indica que el tipo de valor devuelto no se puede especificar.

template<typename T, typename U>
UNKNOWNfunc(T&& t, U&& u){ return t + u; }; 

La introducción de decltype escribe permisos de especificador un desarrollador para obtener el tipo de la expresión que la función de la plantilla devuelve.Utilice la sintaxis alternativa que se muestra más adelante, la palabra clave de declaración de función de auto , y decltype escribe el especificador para declarar un tipo de valor devuelto tarde-especificado .Determinan el tipo de valor devuelto tarde-especificado cuando la declaración es compilada, en lugar de cuando se codifica.

el prototipo siguiente muestra la sintaxis de una declaración de función alternativa.Observe que los calificadores de const y de volatile , y throwespecificación de excepciones son opcionales.El marcador de function_body representa una instrucción compuesta que especifica lo que hace la función.Como procedimiento recomendado de codificación, el marcador de expresión en la instrucción de decltype debe coincidir con la expresión especificada por la instrucción de return , si existe, en function_body.

autonombre_de_función(parámetrosopt)constoptvolatileopt−>decltype(expresión)throwopt{function_body};

En el ejemplo de código siguiente, los tipos de los argumentos de plantilla de t determina el tipo de valor devuelto tarde-especificado de función de plantilla de myFunc y de u .Como procedimiento recomendado de codificación, el ejemplo de código también utiliza las referencias rvalue y la plantilla de función de forward , que admiten reenvío directo.Para obtener más información, vea Declarador de referencia Rvalue: &&.

template<typename T, typename U>
auto myFunc(T&& t, U&& u) -> decltype (forward<T>(t) + forward<U>(u)) 
        { return forward<T>(t) + forward<U>(u); }; 

Decltype y funciones de reenvío

Reenviar llamadas de ajuste de las funciones a otras funciones.Considere una plantilla de función que reenvíe sus argumentos, o los resultados de una expresión que implica los argumentos, a otra función.Además, la función de reenvío devuelve el resultado de llamar a otra función.En este escenario, el tipo de valor devuelto de la función de reenvío debe ser el mismo que el tipo de valor devuelto de la función ajustada.

En este escenario, no puede escribir una expresión adecuada de tipo sin el especificador de tipo de decltype .El reenvío genérico de los permisos del especificador de tipo de decltype funciona porque mantiene la información necesaria sobre si una función devuelve un tipo de referencia.Para obtener un ejemplo de código de una función de reenvío, vea el ejemplo anterior de la función de la plantilla de myFunc .

Ejemplo

El ejemplo de código siguiente declara el tipo de valor devuelto tarde-especificado de función **Plus()**de la plantilla.La función de Plus procesa sus operandos con la sobrecarga de operator+ .Por consiguiente, la interpretación de operador más (+) y el tipo devuelto de la función de Plus depende de los tipos de argumentos de función.

// decltype_1.cpp
// compile with: /EHsc
//
#include "stdafx.h"
#include <iostream>
#include <string>
#include <utility>
#include <iomanip>

using namespace std;

template<typename T1, typename T2>
auto Plus(T1&& t1, T2&& t2) -> 
   decltype(forward<T1>(t1) + forward<T2>(t2))
{
   return forward<T1>(t1) + forward<T2>(t2);
}

class X
{
   friend X operator+(const X& x1, const X& x2)
   {
      return X(x1.m_data + x2.m_data);
   }

public:
   X(int data) : m_data(data) {}
   int Dump() const { return m_data;}
private:
   int m_data;
};

int main()
{
   // Integer 
   int i = 4;
   cout << 
      "Plus(i, 9) = " << 
      Plus(i, 9) << endl;

   // Floating point
   float dx = 4.0;
   float dy = 9.5;
   cout <<   
      setprecision(3) << 
      "Plus(dx, dy) = " <<
      Plus(dx, dy) << endl;

   // String      
   string hello = "Hello, ";
   string world = "world!";
   cout << Plus(hello, world) << endl;

   // Custom type
   X x1(20);
   X x2(22);
   X x3 = Plus(x1, x2);
   cout << 
      "x3.Dump() = " << 
      x3.Dump() << endl;
}

Output

Este ejemplo de código produce los siguientes resultados.

13

13.5

¡Hello, world!

42

Requisitos

Visual C++ 2010 o versiones posteriores.

Vea también

Referencia

Nombres de tipo simple