MSVC constexpr 编译器错误?
MSVC constexpr Compiler Bug?
环境:VS 2019,v16.4.3 w/c++17 + 最新开关
下面的代码规范是正确的,还是我哪里做错了?它使用最新的 gcc/clang 编译器编译良好,但在 MSVC 上失败。 (请参阅下面的错误消息)
template<typename T>
struct mixin {};
struct thing : mixin<thing>
{
constexpr explicit thing(int value) : value_(value) {}
constexpr int value() const { return value_; }
private:
int value_ = 0;
};
template<typename T>
constexpr auto do_mixin_thing(mixin<T> const& m)
{
return static_cast<T const&>(m).value() * 10;
}
int main()
{
constexpr thing t1{ 10 };
// this works
static_assert(t1.value() == 10);
// this fails
static_assert(do_mixin_thing(t1) == 100);
}
这是输出:
error C2131: expression did not evaluate to a constant
message : failure was caused by attempting to access a member on an object of dynamic type 'mixin<thing>' in which the member is not defined
message : see usage of 'thing::value_'
错误指的是main()
中的第2个static_assert
,两条消息指的是thing
.
里面的value()
成员函数
do_mixin_thing()
中的 static_cast
似乎是导致问题的原因。我尝试通过 constexpr T const& self() const { return static_cast<T const&>(*this); }
将演员表添加到 mixin
,但错误仍然存在。
此问题已在 Visual Studio 2019 版本 16.9 中修复。演示:https://gcc.godbolt.org/z/4Y94co6hW
感谢漏洞报告者:https://developercommunity.visualstudio.com/t/valid-static-cast-causing-a-constexpr-failure/908077
环境:VS 2019,v16.4.3 w/c++17 + 最新开关
下面的代码规范是正确的,还是我哪里做错了?它使用最新的 gcc/clang 编译器编译良好,但在 MSVC 上失败。 (请参阅下面的错误消息)
template<typename T>
struct mixin {};
struct thing : mixin<thing>
{
constexpr explicit thing(int value) : value_(value) {}
constexpr int value() const { return value_; }
private:
int value_ = 0;
};
template<typename T>
constexpr auto do_mixin_thing(mixin<T> const& m)
{
return static_cast<T const&>(m).value() * 10;
}
int main()
{
constexpr thing t1{ 10 };
// this works
static_assert(t1.value() == 10);
// this fails
static_assert(do_mixin_thing(t1) == 100);
}
这是输出:
error C2131: expression did not evaluate to a constant
message : failure was caused by attempting to access a member on an object of dynamic type 'mixin<thing>' in which the member is not defined
message : see usage of 'thing::value_'
错误指的是main()
中的第2个static_assert
,两条消息指的是thing
.
value()
成员函数
do_mixin_thing()
中的 static_cast
似乎是导致问题的原因。我尝试通过 constexpr T const& self() const { return static_cast<T const&>(*this); }
将演员表添加到 mixin
,但错误仍然存在。
此问题已在 Visual Studio 2019 版本 16.9 中修复。演示:https://gcc.godbolt.org/z/4Y94co6hW
感谢漏洞报告者:https://developercommunity.visualstudio.com/t/valid-static-cast-causing-a-constexpr-failure/908077