【发布时间】:2020-06-25 18:16:48
【问题描述】:
简介
标准规定每个概念都与两个谓词相关:
- 谓词“被统计”:当一个概念的计算结果为真时,它被一系列模板参数满足。这几乎是一个语法检查。
- 谓词“被建模”:如果 Args 满足 C ([temp.constr.decl]) 并满足在C的规范。 [res.on.requirements]
对于某些概念,使满足的概念建模的要求被清楚地表达了。示例[concept.assignable]
LHS 和 RHS 模型 assignable_from
仅当
- 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 ++
【问题讨论】:
-
default_initializable没有语义要求,所以可能不是一个好例子?就像,我猜,“这些操作都没有表现出未定义的行为”,但如果你必须在所有地方重复它,那会非常乏味? -
@Barry 这正是我的问题。
default_initializable没有明确的语义要求。但它是否要求默认初始化格式正确并且不会导致未定义的行为?还是default_initializable是一个纯粹的句法概念? -
@Oliv: "
default_initializable没有明确的语义要求。但它是否要求默认初始化格式正确且不会导致未定义的行为?" 你的第一句话回答第二个。
标签: c++ language-lawyer c++20 c++-concepts