以下代码是否正确使用了
使用
可通过godbolt here进行测试的代码示例。
似乎如果用等效的宏解决方法,就可以使其(在任何地方)都能编译。取消注释
对我来说,这似乎表明与
(因为宏版本有效,这表明编译器应该具有足够的编译时信息来处理
(此示例只是简单的构思。实际代码是此库的一部分。)
constexpr
函数?它尝试以各种方式访问static constexpr
成员变量_size
。使用
g++
编译没有问题,但在msvc-2017 / 2019
和clang
中失败。可通过godbolt here进行测试的代码示例。
似乎如果用等效的宏解决方法,就可以使其(在任何地方)都能编译。取消注释
USE_MACRO_WORKAROUND
进行测试。对我来说,这似乎表明与
constexpr
函数相关的编译器错误?(因为宏版本有效,这表明编译器应该具有足够的编译时信息来处理
constexpr
函数。显然g ++
可以做到...)
(此示例只是简单的构思。实际代码是此库的一部分。)
#include <cstddef>
//define USE_MACRO_WORKAROUND
template <size_t N = +1>
struct expansion
{
size_t static constexpr _size = N ;
double _xdat [ N ] ;
};
#if defined(USE_MACRO_WORKAROUND)
// ugly macro-based hack that's equiv. to compile
// time foo()...
// does compile everywhere
#define foo(_aa, _bb) _aa._size + _bb._size
#else
// why does this cause problems? works for g++ 7,
// 8, 9, but not msvc, etc
template <size_t NA, size_t NB>
inline size_t constexpr foo (
expansion <NA> const& _aa,
expansion <NB> const& _bb
)
{
return _aa._size + _bb._size;
}
#endif //USE_MACRO_WORKAROUND
template <size_t NA, size_t NB>
inline void goo (
expansion <NA> const& _xx,
expansion <NB> const& _yy
)
{ // this will not compile with msvc, reporting
// C2131: expression did not evaluate to a constant
expansion<foo(_xx, _yy)> _tt;
}
int main ()
{
expansion< 2 > _x2;
expansion< 4 > _x4;
// this seems to work for both g++ and msvc
expansion<foo(_x2, _x4)> _x6;
// via msvc, this leads to the errors above
goo (_x2, _x4) ;
return 0;
}
_size
成员变量在所有地方都是static constexpr
,因此我不清楚为什么这不起作用。使用g++ 7.4
和通过ideone(g++ 8.3
)编译也可以为我编译。 - Darren Engwirda