静态constexpr成员函数在非模板类C ++中不可调用

时间:2018-12-05 13:20:29

标签: c++ templates c++17 constexpr

考虑这个非模板类

struct Foo {
    constexpr static bool TRUE() {
        return true;
    }
};

从外部致电Foo::TRUE()可以正常工作:

int main() {
    static_assert(Foo::TRUE(), "");
}

但不是从Foo本身调用时:

struct Foo {
    constexpr static bool TRUE() {
        return true;
    }
    static_assert(Foo::TRUE(), ""); //ERROR
};
  

错误(有效)的E0028表达式必须具有恒定值
  错误C2131表达式的求值结果不是常量

甚至更奇怪的是,可以通过为该类提供模板来“修复”此问题:

template<int x>
struct Foo {
    constexpr static bool TRUE() {
        return true;
    }
    static_assert(Foo::TRUE(), ""); //compiles fine
};

int main() {
}

尽管Foo::TRUE()int x无关。


这是怎么回事?


我正在使用Visual Studio 17社区版本15.9.0-感谢您的帮助

0 个答案:

没有答案