"The associated constraints are not satisfied" 带有自定义 requires 子句

"The associated constraints are not satisfied" with custom requires clause

在我的一个项目中,我的一个 C++20 概念出现错误“不满足相关约束”。在我看来,我的代码是正确的,所以我一定是对语言有一些误解。

我重写了代码以删除所有明显无关的细节。

以下是包含语句:

#include <array>
#include <memory>

我定义的约束在下面的成员函数Afunc上:

template<typename BLikeType>
class A {
public:
    A(std::shared_ptr<C> c_) : c_(std::move(c_)) {}

    template<typename... Args>
    requires requires (BLikeType t, Args... args) {
        {t.Bfunc(c_->Cfunc(args...))};
    }
    std::array<double, sizeof...(Args)> Afunc(Args... args) {
        return c_->Cfunc(args...);
    }

private:
    std::shared_ptr<C> c_;
};

classes BC 的编写方式试图满足上述约束。我使用 std::array<double, 2> 只是为了让读者理解 A 中的可变参数模板是必要的。

class C {
public:
    C() {}

    std::array<double, 2> Cfunc(double a, double b) {
        return { a, b };
    }
};

我也在A中为模板参数BLikeType写了一个classB。如下所示:

class B {
public:
    B(){}

    double Bfunc(std::array<double, 2> my_array) {
        return my_array[0] + my_array[1];
    }
};

然后我尝试在我的主函数中测试这个约束:

int main() {
    C c{};
    std::shared_ptr<C> c_ptr = std::make_shared<C>(c);

    A<B> a(c_ptr);
    std::array<double, 2> answer = a.Afunc<double, double>(.1, .2); // Error: the associated constraints are not satisfied

    return 0;
}

为什么会出现我的约束不满足的错误?

template<typename... Args>
requires requires (BLikeType t, Args... args) {
    {t.Bfunc(c_->Cfunc(args...))};
}
std::array<double, sizeof...(Args)> Afunc(Args... args) {
    return c_->Cfunc(args...);
}

requires-clause 不是完整的-class 上下文,因此它看不到稍后声明的 class 成员,例如 c_.您可以将 c_ 的声明移到 class 的前面,但即便如此,如果函数是 const(因为函数声明符是在那个时候看到)。使用尾随的 requires-clause 可以解决这个问题。不过,在这种情况下,没有额外的 cv 资格要添加,所以这并不重要。