Mar*_*hrs 2 c++ c++-concepts c++20 requires-expression
以下代码是否需要 T 的隐式复制构造函数,因为参数是按值传递的?或者它的行为类似于 decltype 并且不涉及真正的构造?
template<typename T>
concept Addable = requires (T a, T b){ a + b; };
Run Code Online (Sandbox Code Playgroud)
这个概念只是检查这是否a + b是一个有效的表达式。和There 是简单发明的对象a,b它们是类型的左值T- 它们根本没有被构造。
如果表达式a + b,基于operator+其定义方式,导致复制,那么还将检查该副本,作为查看表达式是否有效的一部分。但除此之外,没有。
例如:
struct A {
A(A const&) = delete;
A& operator=(A const&) = delete;
void operator+(A const&) const;
};
// A is noncopyable, but Addable
static_assert(Addable<A>);
struct B {
B(B const&) = delete;
B& operator=(A const&) = delete;
friend void operator+(B, B) { }
};
// B is noncopyable, but not Addable
// (because invoking + requires copying)
static_assert(!Addable<B>);
Run Code Online (Sandbox Code Playgroud)
表达式的参数requires对这些参数的类型没有任何要求。它们不要求有人通过传递两个 s 来调用函数T。这些类型甚至不必是公开构建的。
requires“参数”只是假设:假设这些东西存在,它们需要做什么?
此类表达式中的各个要求验证该表达式的有效性。a + b需要是一个可以编译的表达式。由于您没有添加验证有关该表达式类型的任何内容的约束,因此该表达式的结果类型并不重要。只要a + b能够编译给定的两个 type 值T,就满足要求。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |