使用变体的折叠表达式中的 MSVC 错误?

问题描述 投票:0回答:1

考虑以下代码:

#include <variant>

class A {};
class B {};

template<typename... Ts, typename Variant>
bool constexpr is_of(const Variant& variant)
{
  return std::visit(
      [](const auto& v) {
        using V = std::decay_t<decltype(v)>;
        return (std::is_same_v<V, Ts> || ...);
      },
      variant);
}


int main()
{
  using Variant = std::variant<A, B>;
  static_assert(is_of<A>(Variant{A{}}));
  static_assert(!is_of<B>(Variant{A{}}));

  static_assert(is_of<B>(Variant{B{}}));  // Fails
  static_assert(!is_of<A>(Variant{B{}}));  // Fails
  
  static_assert(!is_of<int>(Variant{A{}}));
  static_assert(!is_of<int>(Variant{B{}}));
  return 0;
}

is_of
是一个函数,它返回变体中的值是否与一系列类型匹配。

为什么两个

static_assert
都失败了? GCC 和 clang 的行为符合预期。

我无法进一步减少示例。

visit
和折叠表达式似乎至关重要,当我使用
if constexpr
展开它时,它按预期工作。

https://godbolt.org/z/Wbd3GPzbc

c++ visual-c++ variant
1个回答
0
投票

是的,这是 MSVC 中的一个错误,已在 Visual Studio 2022 版本 17.12 中修复,其中接受程序中的所有

static_assert

参见 https://developercommunity.visualstudio.com/t/Wrong-evaluation-of-fold-express-insi/10730639

© www.soinside.com 2019 - 2024. All rights reserved.