c++ - 除了概念之外,在类型约束中禁止类型特征的理由是什么?

标签 c++ c++20 language-design c++-concepts

语言规范在引入概念时隐式禁止类型特征 to be used在类型约束上下文中代替概念:

#include <type_traits>

// doesn't work because std::is_arithmetic_v is not a type
template <std::is_arithmetic_v T> struct A{};

// legal, but doesn't restrict T, but expects an object of type std:: is_arithmetic
template <std::is_arithmetic T> struct B{};

我依稀记得在规范过程中,如果不引入新的 concept,人们就无法让 Concepts 的概念发挥作用。关键字和定义概念的相应机制。

但是,在A的定义中, 构造 template <bool-expression ID>从来都不是合法的,因此允许它不会与其他语言结构发生冲突。

那么,是什么阻碍了直接允许这样的构造而不是必须 introduce a lot of wrapper-Concepts for already existing std type traits — 更不用说自定义类型特征了?


注意:很明显写一个泛型concept包装现有类型特征的模板是微不足道的。这不是如何重用旧特征的问题,而是为什么语言一开始就不允许这样做的问题?甚至可能而不是引入新关键字。

最佳答案

类型特征的普通求值语义拒绝在它们之间定义任何有意义的关系;缺少包含 将阻止约束声明的许多生产性使用。例如:

template<nonstd::is_semiregular_v T> void f(T);
template<nonstd::is_regular_v T> void f(T);
void g(int i) {
  f(i);  // error: ambiguous
}

具有概念的相应代码选择具有更强概念的重载(这可能具有更好的语义或更高效)。

关于c++ - 除了概念之外,在类型约束中禁止类型特征的理由是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74888996/

相关文章:

c++ - 为什么在 C++ 标准库中没有定义 inv_sqrt2?

c++ - 编译器不同意在 constexpr 上下文中使用 std::vector

python - 为什么 Python 将元组、列表、集合和字典视为根本不同的东西?

C# 简短空检查语法

c++ - 是否有任何标准的包含顺序来避免隐藏的依赖关系?

c++ - 轻型 SQL 数据库

c++ - 如何用printf查看float类型的变量?

c++ - Redis 中的消息包

c++ - 如何为概念重载函数?

C++ 迭代器被认为是有害的?