为什么C++20的概念约束没有达到预期效果?

问题描述 投票:0回答:1
#include <concepts>
#include <string>
#include <type_traits>

template<typename T>
requires requires(T const& t) {
    !std::is_enum_v<T>;
    { std::to_string(t) } -> std::same_as<std::string>;
}
void Foo(T const&) {
}

template<typename T>
requires std::is_enum_v<T>
void Foo(T const&) {
}

enum Color {
    Red,
    Green,
    Blue,
};

int main() {
    Foo(Red); // error: Call to 'Foo' is ambiguous
}

显然,两个重载的

Foo
是互斥的;也就是说,如果
std::is_enum_v<T>
true
,则不应选择前者。但是
clang-18 -std=c++20
给出了错误。

为什么C++20的概念约束没有达到预期效果?

c++ constraints overloading c++20 c++-concepts
1个回答
0
投票

!std::is_enum_v<T>
块中的
requires
结构良好,因此被接受。要检查该值,您需要编写
requires(!std::is_enum_v<T>)
。这两件事可以结合起来,如下例所示:

template<typename T>
requires(!std::is_enum_v<T>) && 
requires(T const& t) {
    { std::to_string(t) } -> std::same_as<std::string>;
}
void Foo(T const&) {
}

查看演示

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