【问题标题】:Why can't I declare a static constexpr variable in a template class using msvc?为什么我不能使用 msvc 在模板类中声明静态 constexpr 变量?
【发布时间】:2019-10-11 07:40:28
【问题描述】:

我有一个模板类,我想声明一个与该类相同类型的静态 constexpr 变量。使用 gnu 编译器它工作得很好,但是使用 Microsoft Visual Studio,它不会编译。我是不是做错了什么,是 gnu 编译器对我很友好,还是 Microsoft 编译器有问题? 我知道我可以修复它,更改执行相同操作的函数的变量,但我很好奇。

template <typename T>
constexpr T One() noexcept { return static_cast<T>( 1 ); }

template <typename T>
struct Test {
    T val;

    static constexpr Test example{ One<T>() };                    // compiles only with gnu
    static constexpr Test Example() { return Test{ One<T>() }; }  // compiles with both gnu and microsoft
};

给定的错误(Visal Studio 2017)是:

错误 C2017:使用未定义类型“测试”

【问题讨论】:

  • 哪个确切版本的 MSVC?
  • 我之前也在编译器资源管理器上尝试过,即使是 19.20 版也无法编译
  • 因为 GNU 太宽容了!! example 应该有返回声明!
  • 但它是一个变量...

标签: c++ visual-studio templates gnu constexpr


【解决方案1】:

在最后一个} 之前,您的Test 模板类型不完整。

这是very similar question,它添加了第三个编译器。如您所见,答案是 VC++ 和 clang 尊重标准,而 gcc 则不。

【讨论】:

  • 是的,做一些测试,如果类不是模板 gnu 也可以防止声明不完整的类型,所以我猜它编译的事实一定是模板的恶作剧。
猜你喜欢
  • 2013-08-01
  • 2014-04-13
  • 2011-04-04
  • 1970-01-01
  • 2016-04-23
  • 2011-01-23
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多