require 表达式的隐式可复制要求

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)

Bar*_*rry 7

这个概念只是检查这是否a + b是一个有效的表达式。和There 是简单发明的对象ab它们是类型的左值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)


Nic*_*las 6

表达式的参数requires对这些参数的类型没有任何要求。它们不要求有人通过传递两个 s 来调用函数T。这些类型甚至不必是公开构建的。

requires“参数”只是假设:假设这些东西存在,它们需要做什么?

此类表达式中的各个要求验证该表达式的有效性。a + b需要是一个可以编译的表达式。由于您没有添加验证有关该表达式类型的任何内容的约束,因此该表达式的结果类型并不重要。只要a + b能够编译给定的两个 type 值T,就满足要求。