【发布时间】:2023-03-15 05:07:01
【问题描述】:
我有以下代码:
#include <variant>
template <typename T>
struct S{};
using Var = std::variant<S<int>, S<float>>;
template <typename T>
concept VariantMember = requires(Var var) { std::get<T>(var); };
void foo(VariantMember auto x) {}
void foo(auto x) {}
void bar()
{
foo(S<int>{});
foo(S<char>{});
}
MSVC 错误
error C2338: get(variant
&) 要求 T 在 Types 中只出现一次。 (N4835 [variant.get]/5)
在这种情况下,只有当我在变体 S 中使用同一模板的两个实例时才会发生这种情况。所以首先std::get出乎意料地出错,然后这个概念并没有失败,而是直接出错。有趣的是,如果我在概念之外使用std::get,例如:
std::get<S<int>>(Var{ S<int>{} });
代码编译良好。
Clang 似乎只是忽略了这个概念,在这两种情况下总是选择foo 的第一个重载。
这些实际上是错误还是我搞砸了?
【问题讨论】:
-
如果我使用
std::get_if<T>(&var)这个概念似乎总是成功 :D godbolt.org/z/MK7cr91q1
标签: c++ visual-c++ clang c++20 c++-concepts