Использование decltype как typedef - PullRequest
0 голосов
/ 02 мая 2018

Экспериментируйте с decltype для использования вместо typedef или auto ключевых слов, когда это будет сочтено необходимым. Некоторые из них (stl и пользовательская функция) работают, однако не работают напрямую с определенным пользователем объектом. Пожалуйста, мне нужно объяснение здесь.

#include <iostream>
#include <vector>

using namespace std;

struct foo {
    void operator=(const int a ) { val_ =a;}
    int get() const { return val_;}
  private:
    int val_;
}; 

ostream& operator << (ostream& os, foo f )
{
    os << f.get();
    return os;
}

foo func()
{
    foo a;
    return a;
}

int main()
{
    vector<foo> foos;
    decltype(foos) b; //works

    decltype(foo);//  don't work  - says - error C3553: decltype expects an expression not a type

    decltype(func()) a; //works
    a = 100;

    std::cout << a << " \n";
}

EDITED

vector<foo> foos;
decltype(foos) b; //works :tested with vc++ compiler


decltype(vector<foo>) b; //fails

1 Ответ

0 голосов
/ 02 мая 2018

decltype эквивалентен типу объявления своего операнда объекта (или фиктивного объекта). Таким образом, вы кормите его объектом и получаете класс во время компиляции. Поскольку результатом является тип, вы можете использовать его там, где ожидается typename. Вы не можете кормить его с типом. https://en.cppreference.com/w/cpp/language/decltype

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...