Sdílet prostřednictvím


decltype – specifikátor typu

Specifikátor typu decltype vrací typ zadaného výrazu.Specifikátor typu decltype, spolu s klíčovým slovem auto, je užitečný především pro vývojáře, kteří vytvářejí knihovny šablon.Klíčová slova auto a decltype lze použít k deklarování šablony funkce, jejichž návratový typ závisí na typech argumentů šablony.Nebo lze klíčová slova auto a decltype použít k deklarování šablony funkce, která zaobaluje volání další funkce a poté vrátí návratový typ volané funkce.

 decltype( expression )

Parametry

Parametr

Description

expression

Výraz.Další informace naleznete v tématu Výrazy (C++).

Vrácená hodnota

Typ parametru expression.

Poznámky

Specifikátor typu decltype je podporován v jazyce Visual C++ 2010 nebo novější verzi a lze jej použít s nativním nebo spravovaným kódem.

Kompilátor používá následující pravidla pro určení typu parametru expression.

  • Pokud je parametr expression identifikátor nebo člen třídy, specifikátor typu decltype(expression) je typ entity s názvem expression.Pokud není žádná taková entita nebo parametr expression vyjmenovává sadu přetížených funkcí, kompilátor vrátí chybovou zprávu.

  • Pokud je parametr expression volání funkce nebo funkce přetíženého operátoru, je specifikátor typu decltype(expression) návratový typ této funkce.Závorky kolem přetíženého operátoru jsou ignorovány.

  • Pokud je parametr expressionr-hodnota, je specifikátor typu decltype(expression) typu expression.Pokud je parametr expressionl-hodnota, je specifikátor typu decltype(expression)reference l-hodnoty na typ expression.

Následující příklad kódu ukazuje některá použití specifikátoru typu decltype.Nejprve předpokládejme, že jste nakódovali následující příkazy.

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

Dále zkontrolujte typy, které jsou vráceny pomocí čtyř příkazů decltype v následující tabulce.

Příkaz

Type

Poznámky

decltype(fx());

const int&&

Odkaz r-hodnoty na typ const int.

decltype(var);

int

Typ proměnné var.

decltype(a->x);

double

Typ přístupu člena.

decltype((a->x));

const double&

Vnitřní závorky způsobí, že je příkaz vyhodnocen jako výraz namísto přístupu ke členu.A protože je proměnná a deklarována jako ukazatel const, je tento typ ukazatelem na typ const double.

Klíčová slova Decltype a Auto

Použijte specifikátor typu decltype, spolu s klíčovým slovem auto, k deklarování šablony funkce, jejíž návratový typ závisí na typech šablony argumentů.Zvažte například následující příklad kódu, ve kterém návratový typ šablony funkce závisí na typech šablony argumentů.V příkladu kódu zástupný symbol UNKNOWN označuje, že nelze určit návratový typ.

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

Použití specifikátoru typu decltype umožňuje vývojáři získat typ výrazu, který šablona funkce vrátí.Použijte alternativní syntaxi deklarace funkce, která je uvedena dále, klíčové slovo auto a specifikátor typu decltype pro deklaraci pozdně určeného návratového typu.Pozdně určený návratový typ je určen při kompilaci deklarace, nikoli když je kódován.

Následující prototyp znázorňuje syntaxi alternativní deklarace funkce.Všimněte si, že kvalifikátory const a volatile a specifikace výjimky throwwfa0edys(v=vs.120).md jsou volitelné.Zástupný symbol function_body představuje složený příkaz, který určuje, k čemu funkce slouží.Je osvědčeným postupem, že zástupný symbol expression v příkazu decltype by měl odpovídat výrazu určeném příkazem return v zástupném symbolu function_body, pokud existuje.

autofunction_name(parametersvolitelné)constvolitelnévolatilevolitelné−>decltype(expression)throwvolitelné{function_body};

V následujícím příkladu kódu je pozdně zadaný návratový typ šablony funkce myFunc určen pomocí typů t a u šablony argumentů.Jako osvědčený postup tento příklad kódu používá také odkazy na r-hodnoty a šablonu funkce forward, která podporuje dokonalé předávání.Další informace naleznete v tématu Deklarátor odkazu hodnoty R: &&.

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); }; 

Klíčové slovo Decltype a funkce předávání

Funkce předávání zaobalují volání dalších funkcí.Zvažte šablonu funkce, která předává své argumenty nebo výsledky výrazu, který zahrnuje tyto argumenty, jiné funkci.Kromě toho funkce předávání vrátí výsledek volání další funkce.V tomto scénáři by měl návratový typ funkce předávání být stejný jako návratový typ zabalené funkce.

V tomto scénáři nelze odpovídající typ výrazu zapsat bez specifikátoru typu decltype.Specifikátor typu decltype umožňuje obecné funkce předávání, protože neztratí potřebné informace o tom, zda funkce vrací odkaz.Příklad kódu funkce předávání naleznete v předchozím příkladu šablony funkce myFunc.

Příklad

Následující příklad kódu deklaruje pozdně zadaný návratový typ šablony funkce Plus().Funkce Plus zpracuje své dva operandy s přetížením operator+.V důsledku toho interpretace operátoru plus (+) a návratový typ funkce Plus závisí na typech argumentů funkce.

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

Výsledek

Tento příklad kódu vrací následující výsledky.

13

13.5

Hello, world!

42

Požadavky

Jazyk Visual C++ 2010 nebo novější verze.

Viz také

Referenční dokumentace

Jednoduché typy názvů