Как указать тип функции constexpr, возвращающей класс (без обращения к ключевому слову auto)

В основном ниже я хочу посмотреть, смогу ли я обойтись, используя auto ключевое слово

Предположим, что у нас есть следующий фрагмент кода [работает с g++ 4.9.2 (Ubuntu 4.9.2-10ubuntu13) и clang версии 3.6.0]:

//g++ -std=c++14 test.cpp
//test.cpp

#include <iostream>
using namespace std;

template<typename T>
constexpr auto create() {
  class test {
  public:
    int i;
    virtual int get(){
      return 123;
    }
  } r;
  return r;
}

auto v = create<int>();

int main(void){
  cout<<v.get()<<endl;
}

Как я могу указать тип v вместо того, чтобы использовать auto ключевое слово в точке объявления / определения? Я старался create<int>::test v = create<int>(); но это не работает.

п.с.

1) это отличается от вопроса, который я задавал при возврате класса из функции constexpr требует виртуального ключевого слова с g ++, даже если код такой же

2) Я не хочу определять класс вне функции.

1 ответ

Решение

Фактический тип скрыт, поскольку он локальный внутри функции, поэтому вы не можете явно использовать его. Однако вы должны быть в состоянии использовать decltype как в

decltype(create<int>()) v = create<int>();

Я не вижу причины, чтобы сделать так, хотя, когда auto работает.

Другие вопросы по тегам