【发布时间】:2020-04-20 15:54:45
【问题描述】:
如果所有模板参数都是唯一的,我正在尝试编写一个返回 true 的函数。
伪代码:
template<typename... Ts>
auto types_are_unique() -> bool {
return (no two Ts are the same);
}
我不想“手动”比较每个T,而是想利用一个事实,即如果两个或多个基类相同,则不允许多重继承。
#include <utility>
template <typename T>
struct X {};
template <typename... Ts>
struct Test : X<Ts>... {};
template <typename... Ts>
constexpr auto types_are_unique() -> bool {
return false;
}
template <typename... Ts>
requires requires { Test<Ts...>{}; }
constexpr auto types_are_unique() -> bool {
return true;
}
int main() {
static_assert(types_are_unique<int, float>()); // compiles
static_assert(not types_are_unique<int, int>()); // fails
}
gcc 和 clang 都同意编译失败是因为 unique.cpp:7:8: error: duplicate base type ‘X<int>’ invalid。
这令人惊讶,阅读https://en.cppreference.com/w/cpp/language/constraints#Requires_expressions
将模板参数替换为模板实体声明中使用的 requires 表达式可能会导致在其需求中形成无效类型或表达式,或违反这些需求的语义约束。在这种情况下, requires-expression 的计算结果为 false,不会导致程序格式错误。
clang 和 gcc 错了吗?还是 cppreference 错了?或者(很可能)我读错了?
requires 表达式中不允许出现哪些类别的替换失败?请参阅当前 C++20 草案的相应部分。
【问题讨论】:
-
硬错误与软错误...
-
您能否指出标准草案中
requires表达式的这种区别?
标签: c++ language-lawyer c++20 c++-concepts