在VS2017中不是编译时常量表达式

Evg*_*Evg 13 c++ templates constexpr c++11 visual-studio-2017

VS2017 15.1无法编译以下代码:

template<int data_size>
struct Data { };

template<int s>
struct Base
{
    static constexpr int size() { return s; }
};

template<int s>
struct Derived : Base<s>   // struct Derived
{
    Data<Base<s>::size()> data;
};

int main()
{
    Derived<1> c;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

error C2975: 'data_size': invalid template argument for 'Data', expected compile-time constant expression
note: see declaration of 'data_size'
note: see reference to class template instantiation 'Derived<s>' being compiled
Run Code Online (Sandbox Code Playgroud)

如果我不是从中衍生Derived出来的Base,那么错误就会消失.使用gcc 5.4.0和clang 4.0.0在这两种情况下一切都很好.

这段代码有什么问题吗?

Evg*_*Evg 0

这是 Visual Studio 的一个错误。根据 Visual Studio 反馈系统报告,该问题已在 Visual Studio 2019 版本 16.2 中修复。