满意和建模的概念?

Satisfied and modeled concept?

本文关键字:建模 满意      更新时间:2023-10-16

简介

该标准规定每个概念都与两个谓词相关:

  1. 谓词"由统计":当一个概念的计算结果为 true 时,它由一系列模板参数满足。这几乎是一种语法检查。
  2. 谓词"is modeled by":如果 Args 满足 C ([temp.constr.decl]( 并满足 C 规范中给出的所有语义要求(如果有的话(,则称模板参数的序列 Args 对概念 C 进行建模。[要求]

对于某些概念,清楚地表达了使满意概念建模的要求。示例 [概念可分配]

LHS 和 RHS 模型assignable_from<LHS,> 仅在以下情况下

  • Addressof(LHS = RHS( == Addressof(lcopy(
  • [...]

但我想知道句法要求是否也隐含了语义要求。

问题

句法谓词是否隐含地暗示了对要建模的概念的要求?

我看到两种隐含的要求:

  1. 满足该概念是因为语法检查的表达式是未计算的表达式,如果这些表达式不是未计算的表达式,则此类表达式将导致程序格式不正确。
  2. 满足该概念是因为不计算语法检查的表达式,但对这些表达式的评估将导致程序具有未定义的行为。

例子

例如,让我们考虑此处定义的default_initializable概念:[concept.default.init]。

default_initializable满足A<int>但如果默认初始化了A<int>类型的变量,则程序格式不正确(demo(:

template <class T>
struct A { 
A() {
f(T{});
}
};
static_assert (default_initializable <A<int>>);  // A<int> satisfies default_initializable
A<int> a{}; //compile time error: f not declared in this scope

default_initializable满足A但默认初始化A导致未定义的行为(当默认初始化之前没有零初始化时((演示(:

struct A { 
int c;
A() {
c++;
}
};
static_assert (default_initializable <A>); // A satisfies default_initializable
auto p = new A;  //undefined behavior: indeterminate-value as operand of operator ++

一个概念的计算结果为 true 时,它由一系列模板参数满足。这几乎是一种语法检查。

不,它不是"几乎"任何东西:它是一个语法检查。例如,requires子句指定的约束验证特定语法是否是该类型的合法语法。这就是">满足一个概念"的全部含义。

句法谓词是否隐含地暗示了对要建模的概念的要求?

。不。如果满足一个概念也意味着对概念进行建模,那么标准就不需要不同的术语来描述这些术语。

进行这种区分的要点是认识到概念语言功能无法指定概念作为概念应封装的每个要求。因此,满足概念只是语言部分,而建模概念包括语言无法做到的事情。

但这个问题与你的两个例子所显示的有点分开。您的示例表示"有效语法"和"可以编译/执行"之间的区别。满足一个概念只关心前者。对概念进行建模只关心后者,只要明确指定了所述语义行为。

标准中没有关于隐式语义要求的内容。没有大意是"概念中的所有表达式/语句必须能够编译和/或执行才能对其进行建模"的陈述。也不打算这样做。

无论我们试图假装它比这更多,C++20 中存在的概念只不过是执行 SFINAE 的更方便的机制。SFINAE 无法测试某些表达式内容的可编译/可执行有效性,因此概念也不能。概念也没有试图假装它可以。