-->

How to specify type of a constexpr function return

2019-10-09 02:08发布

问题:

Basically in below I want to see if I can get around having to use auto keyword

Suppose that we have the following piece of code [works with g++ 4.9.2 (Ubuntu 4.9.2-10ubuntu13) & clang version 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;
}

How can I specify the type of v rather than using the auto keyword at its point of declaration/definition? I tried create<int>::test v = create<int>(); but this does not work.

p.s.

1)this is different from the question that I was asking at Returning a class from a constexpr function requires virtual keyword with g++ even through the code is the same

2)I do not want to define the class outside the function.

回答1:

The actual type is hidden as it's local inside the function, so you can't explicitly use it. You should however be able to use decltype as in

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

I fail to see a reason to do like this though, when auto works.