首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何声明和定义具有推导类型的静态成员?

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

Stack Overflow用户
提问于 2018-07-24 07:44:14
回答 1查看 180关注 0票数 5

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

代码语言:javascript
复制
struct X {
    static auto x = makeObjectWithComplexType();
};

但这不是C++。因此,我试着解决这个问题,并认为下面的片段会起作用,但它没有:

代码语言:javascript
复制
#include <string>

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

    static decltype(abc()) x;
};

decltype(abc()) X::x;

int main() {}

它在错误中失败:错误:“静态自动X::abc()”的使用在扣除‘auto’*之前

有没有办法让上面的片段起作用。或者,还有其他方法来定义具有推导类型的静态成员吗?

EN

回答 1

Stack Overflow用户

发布于 2018-09-12 22:41:58

如果您有C++17,那么您可以这样做:

代码语言:javascript
复制
struct X {
    static inline auto x = makeObjectWithComplexType();
};

如果你不这样做,不幸的是你不得不重复makeObjectWithComplexType()

代码语言:javascript
复制
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?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51493143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档