описатель типа decltype

decltype описатель типа создает тип указанного выражения.decltype описатель типа, а также автоматическое ключевое словов основном, полезны для разработчиков, которые записывают библиотеки стандартных шаблонов.Используйте auto и decltype объявления зависят от возвращаемого типа функции шаблона, типы его аргументов шаблона.Или используйте auto и decltype для объявления функции шаблона, который создает программу-оболочку вызов другой функции, а затем создать программу-оболочкуой возвращайте тип возвращаемого значения функции.

 decltype( expression )

Параметры

Параметр

Описание

expression

Выражение.Дополнительные сведения см. в разделе Выражения (C++).

Возвращаемое значение

Тип параметра expression.

Заметки

decltype описатель типа поддерживается в Visual C++ 2010 или более поздних версиях, а также может использоваться с собственным или управляемым кодом.

Компилятор использует следующие правила определения типа expression параметр.

  • Если expression параметр идентификатора или a доступ к членам класса" decltype(expression) тип сущности, с которым следуют expression.Если такая сущность или expression имена параметров набор перегруженных функций, компилятор создает сообщение об ошибке.

  • Если expression параметр вызов функции или перегруженной функции операторов decltype(expression) тип возвращаемого значения функции.Скобки вокруг перегруженного оператора не учитываются.

  • Если expression параметр значение rvalue" decltype(expression) тип expression.Если expression параметр lvalue" decltype(expression)ссылка lvalue тип expression.

В следующем примере кода показаны некоторые использует decltype описатель типа.Во-первых, предположим, что необходимо закодируйте следующие выписки.

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

Далее проверьте, какие типы возвращаются 4 decltype выписки в следующей таблице.

Оператор

Тип

Примечания

decltype(fx());

const int&&

ссылка rvalue к a const int.

decltype(var);

int

Тип переменной var.

decltype(a->x);

double

Тип доступа к члену.

decltype((a->x));

const double&

Внутренние скобки, вызывают выписку должен вычисляться как вместо выражения доступа к члену.И a объявляет в качестве a const указатель введите ссылка на const double.

Decltype и auto

Используйте decltype введите описатель вместе с auto объявление ключевое слово, зависят от возвращаемого типа функции шаблона, типы его аргументов шаблона.Например, рассмотрим следующий пример кода, в котором возвращаемый тип зависит от функции шаблона типы аргументов шаблона.В примере кода Нет данных заполнитель, указывающий, что возвращаемый тип не может быть указан.

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

Введение decltype описатель типа позволяет разработчику получить тип выражения, что возвращает функция шаблона.Используйте альтернативный синтаксис объявления функции это показано ниже, auto ключевое слово и decltype описатель типа для объявления a поздно-определено возвращаемый тип.Поздно-определенный тип возвращаемого значения определяется при объявлении компилироваться, а не при его закодировано.

Следующий прототип иллюстрирует синтаксис альтернативного объявления функции.Обратите внимание, что const и volatile квалификаторы и throwспецификация исключений необязательные. Function_body заполнитель представляет собой составное выписку, которая указывает, что функция делает.В качестве оптимального кодирования, метод Выражение местозаполнитель в decltype выписка должна соответствовать выражению, определенному return выписка, при наличии таковой, в function_body.

autofunction_name(параметрыOpt)constOptvolatileOpt−>decltype(Выражение)throwOpt{function_body};

В следующем примере кода поздно-определенный тип возвращаемых данных myFunc функция шаблона определяется типами t и u аргументы шаблона.В качестве оптимального практика кодирования, примере кода используется ссылка rvalue и forward шаблон функции, поддерживающие препровождение совершенное.Дополнительные сведения см. в разделе Декларатор ссылки 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 и функции препровождения

Использование программы-оболочек вызовы функций препровождения к другим функциям.Рассмотрим шаблон функции, переадресует ее аргументы или результаты выражения, которое включает эти аргументы в другую функцию.Кроме того, функция препровождения возвращает результат вызывать другую функцию.В этом сценарии возвращаемый тип функции препровождения должен быть тем же, что и тип возвращаемого значения функции создания программу-оболочкуой.

В данном сценарии нельзя записать без соответствующее выражение типа decltype описатель типа.decltype описатель типа включает родовые функции препровождения, поскольку он не теряет необходимые сведения о возвращает значение, указывающее, является ли функция является ссылочным типом.Пример кода см. в предыдущей функции препровождения myFunc пример функции шаблона.

Пример

В следующем примере объявляется поздно-определенный возвращаемый тип функции шаблона Plus().Plus функция интерпретирует его операнда с 2 operator+ перегрузка.Следовательно, интерпретация добавочного оператора (+) и возвращаемый тип Plus значение зависит от функции типы аргументов функции.

// 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

Данный пример кода создает следующие результаты.

13

13.5

Hello, world!

42

Требования

Visual C++ 2010 или более поздние версии.

См. также

Ссылки

Имена простого типа