我需要用一个复杂的(很多模板参数)类型定义一个静态成员(不是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()”有什么办法可以使上面的代码片段正常工作。还是有其他方法来定义具有推断类型的静态成员?
答案 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?