如何声明和定义具有推断类型的静态成员?

时间:2018-07-24 07:44:14

标签: c++ c++17

我需要用一个复杂的(很多模板参数)类型定义一个静态成员(不是constexpr)。因此,希望有这样的东西:

struct X {
    static auto x = makeObjectWithComplexType();
};

但是它不是C ++。因此,我尝试解决该问题,并认为下面的代码片段可以工作,但无效:

#include <string>

struct X {
    static auto abc() {
        return std::string();
    }

    static decltype(abc()) x;
};

decltype(abc()) X::x;

int main() {}

它失败并显示错误:错误:在扣除“ auto` *

之前使用“ static auto X :: abc()”

有什么办法可以使上面的代码片段正常工作。还是有其他方法来定义具有推断类型的静态成员?

1 个答案:

答案 0 :(得分:3)

如果您具有C ++ 17,则可以执行以下操作:

struct X {
    static inline auto x = makeObjectWithComplexType();
};

如果不这样做,很遗憾,您必须重复makeObjectWithComplexType()

struct X {
    static decltype(makeObjectWithComplexType()) x; // declaration
};

auto X::x = makeObjectWithComplexType(); // definition

请注意,clang可以成功编译该版本,但gcc和msvc不能。我不确定哪个编译器正确,所以我在question中提出了要求。


如果您有兴趣,为什么您的解决方法不起作用,请查看以下问题:Why can't the type of my class-static auto function be deduced within the class scope?