满意和建模的概念?
Satisfied and modeled concept?
简介
标准规定每个概念都与两个谓词相关:
- 谓词“被统计为”:当一个概念的计算结果为真时,它被一系列模板参数所满足。这几乎是一个语法检查。
- 谓词“建模于”:如果 Args 满足 C ([temp.constr.decl]) 并且满足所有语义要求(如果any) 在 C. [res.on.requirements]
的规范中给出
对于某些概念,明确表达了使满意的概念建模的要求。示例 [concept.assignable]
LHS and RHS model assignable_from<LHS, RHS> only if
- addressof(lhs = rhs) == addressof(lcopy)
- [...]
但我想知道句法要求是否也隐含地暗示了语义要求。
问题
句法谓词是否隐含地暗示对要建模的概念的要求?
我看到两种隐含的要求:
- 这个概念得到满足,因为经过语法检查的表达式是未计算的表达式,如果这些表达式不是未计算的表达式,则此类表达式将导致程序格式错误。
- 这个概念得到满足,因为语法检查的表达式不会被评估,但对这些表达式的评估会导致程序具有未定义的行为。
例子
例如,让我们考虑此处定义的 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 ++
a concept is satisfied by a sequence of template argument when it evaluates to true. This is almost a syntactic check.
不,它“几乎”不是任何东西:它是语法检查。 requires
子句指定的约束(例如)验证特定语法是该类型的合法语法。这是所有“满足一个概念”的意思。
Does the syntactic predicates implicitly imply requirement for the concept to be modeled?
...没有。如果满足一个概念也意味着对概念建模,那么标准就不需要针对这些不同的术语。
具有这种区别的意义在于认识到概念语言功能无法指定概念作为概念应封装的所有要求。所以满足概念只是语言部分,而概念建模包括语言无法做到的事情。
但是这个问题与你的两个例子所展示的问题有点不同。您的示例代表了“有效语法”和“可以是 compiled/executed”之间的区别。满足一个概念只关心前者。并且建模一个概念只关心后者 在某种程度上 所述语义行为是 明确 指定的。
标准中没有关于隐式语义要求的内容。没有声明“概念中的所有 expressions/statements 必须能够被编译 and/or 执行才能被建模”。也不打算这样做。
无论我们多么努力地假装它不止于此,C++20 中存在的概念只不过是一种执行 SFINAE 的更方便的机制。 SFINAE 无法测试 compilable/executable 某些表达式内容的有效性,因此概念也不能。概念也不会假装它可以。
简介
标准规定每个概念都与两个谓词相关:
- 谓词“被统计为”:当一个概念的计算结果为真时,它被一系列模板参数所满足。这几乎是一个语法检查。
- 谓词“建模于”:如果 Args 满足 C ([temp.constr.decl]) 并且满足所有语义要求(如果any) 在 C. [res.on.requirements] 的规范中给出
对于某些概念,明确表达了使满意的概念建模的要求。示例 [concept.assignable]
LHS and RHS model assignable_from<LHS, RHS> only if
- addressof(lhs = rhs) == addressof(lcopy)
- [...]
但我想知道句法要求是否也隐含地暗示了语义要求。
问题
句法谓词是否隐含地暗示对要建模的概念的要求?
我看到两种隐含的要求:
- 这个概念得到满足,因为经过语法检查的表达式是未计算的表达式,如果这些表达式不是未计算的表达式,则此类表达式将导致程序格式错误。
- 这个概念得到满足,因为语法检查的表达式不会被评估,但对这些表达式的评估会导致程序具有未定义的行为。
例子
例如,让我们考虑此处定义的 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 ++
a concept is satisfied by a sequence of template argument when it evaluates to true. This is almost a syntactic check.
不,它“几乎”不是任何东西:它是语法检查。 requires
子句指定的约束(例如)验证特定语法是该类型的合法语法。这是所有“满足一个概念”的意思。
Does the syntactic predicates implicitly imply requirement for the concept to be modeled?
...没有。如果满足一个概念也意味着对概念建模,那么标准就不需要针对这些不同的术语。
具有这种区别的意义在于认识到概念语言功能无法指定概念作为概念应封装的所有要求。所以满足概念只是语言部分,而概念建模包括语言无法做到的事情。
但是这个问题与你的两个例子所展示的问题有点不同。您的示例代表了“有效语法”和“可以是 compiled/executed”之间的区别。满足一个概念只关心前者。并且建模一个概念只关心后者 在某种程度上 所述语义行为是 明确 指定的。
标准中没有关于隐式语义要求的内容。没有声明“概念中的所有 expressions/statements 必须能够被编译 and/or 执行才能被建模”。也不打算这样做。
无论我们多么努力地假装它不止于此,C++20 中存在的概念只不过是一种执行 SFINAE 的更方便的机制。 SFINAE 无法测试 compilable/executable 某些表达式内容的有效性,因此概念也不能。概念也不会假装它可以。