满意和建模的概念?
Satisfied and modeled concept?
简介
该标准规定每个概念都与两个谓词相关:
- 谓词"由统计":当一个概念的计算结果为 true 时,它由一系列模板参数满足。这几乎是一种语法检查。
- 谓词"is modeled by":如果 Args 满足 C ([temp.constr.decl]( 并满足 C 规范中给出的所有语义要求(如果有的话(,则称模板参数的序列 Args 对概念 C 进行建模。[要求]
对于某些概念,清楚地表达了使满意概念建模的要求。示例 [概念可分配]
LHS 和 RHS 模型assignable_from<LHS,> 仅在以下情况下
- 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 ++
一个概念的计算结果为 true 时,它由一系列模板参数满足。这几乎是一种语法检查。
不,它不是"几乎"任何东西:它是一个语法检查。例如,requires
子句指定的约束验证特定语法是否是该类型的合法语法。这就是">满足一个概念"的全部含义。
句法谓词是否隐含地暗示了对要建模的概念的要求?
。不。如果满足一个概念也意味着对概念进行建模,那么标准就不需要不同的术语来描述这些术语。
进行这种区分的要点是认识到概念语言功能无法指定概念作为概念应封装的每个要求。因此,满足概念只是语言部分,而建模概念包括语言无法做到的事情。
但这个问题与你的两个例子所显示的有点分开。您的示例表示"有效语法"和"可以编译/执行"之间的区别。满足一个概念只关心前者。对概念进行建模只关心后者,只要明确指定了所述语义行为。
标准中没有关于隐式语义要求的内容。没有大意是"概念中的所有表达式/语句必须能够编译和/或执行才能对其进行建模"的陈述。也不打算这样做。
无论我们试图假装它比这更多,C++20 中存在的概念只不过是执行 SFINAE 的更方便的机制。SFINAE 无法测试某些表达式内容的可编译/可执行有效性,因此概念也不能。概念也没有试图假装它可以。
- 满意和建模的概念?
- MSVC对这段代码很满意,但GCC并不那么热衷
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- C++ JNI 不满意的链接错误
- 动态车辆建模和仿真启动条件
- 将矩阵建模为单个统一缓冲区对象
- 编译问题LD:不满意的符号
- 列明智的建模在音乐会技术中 - 列生成
- 如何查询类型是否建模结构
- 不满意的链接错误,当使用LLVM运行javacpp预设时
- 将其建模为BFS背后的直觉
- Systemc传输级建模从TLM_Generic_Payload提取两个整数
- 如何在Caffe中对复发性卷积神经网络进行建模
- 对火箭C 的速度和高度进行建模
- 关于在 ndk r15 中的类中初始化的静态成员的不满意链接错误
- 范围 v3 和 view_facade,无法对 ForwardRange 进行建模
- 我应该使用什么数据结构来对数据库/表进行建模
- 使用 SWIG 将 c++ 包装到 java 不满意的链接错误: HeaderJNI.new_Test()J.
- 在具有可替换阶段的C++中建模管道
- 发生 JNI 调用 c++ dll "不满意链接错误: 对内存位置的无效访问"