在类定义中推导内联静态成员函数的返回类型

Nar*_*oot 3 c++ return-type-deduction c++17

我试图在内联函数定义之后创建一个返回类型的别名来存储成员变量.我在下面简化了我的情况(我想要别名的真实类型比矢量更难以输入,而真正的函数比单行更复杂.)

#include <vector>
using namespace std;
struct Test {
    template <typename T>
    static auto GetVector() { return vector<T>(); }

    using VecInt = decltype(GetVector<int>());
    VecInt x;
};
Run Code Online (Sandbox Code Playgroud)

但是,clang using VecInt在行上给出了以下错误:

错误:具有推导返回类型的函数'GetVector'在定义之前不能使用.

gcc也给我一个类似的错误.奇怪的是,这个编译,虽然它在我的情况下没用:

#include <vector>
using namespace std;
struct Test {
    template <typename T>
    static auto GetVector() { return vector<T>(); }

    void dummy() {
        using VecInt = decltype(GetVector<int>());
        VecInt x;
    }
};
Run Code Online (Sandbox Code Playgroud)

有没有办法让我在内联定义后别名?或者,我可以在结构顶部移动GetVector()函数,代码将编译.但是,我想在那里包含它.

Nic*_*las 5

您是否注意到如何从其他成员函数内部调用内联定义的成员函数,即使被调用者在类中比调用者更远?之所以有效,是因为编译器采用了成员函数的内联定义,并将定义移到了类的底部,就在}部件之后.所以你实际上有一个隐含的前向声明.

对于声明等类型别名,情况并非如此using.这些声明确实存在于课堂上; 他们不能引用课程后面的声明或定义.

由于函数的返回值不能仅由声明推断,并且实际定义(推断返回值所需的东西)存在于类的末尾,因此using别名无法编译.除了直接声明函数的返回值之外,你无能为力.或者将类型别名声明为具有所需类型,然后让函数使用该别名.