C++:如何编写一个要求构造函数是noexcept的概念?

fkaflof6  于 2023-05-20  发布在  其他
关注(0)|答案(2)|浏览(198)

如何编写一个要求类具有noexcept构造函数的概念?例如,以下static_assert在Clang 15.0.7中为真,尽管我觉得它不应该为真。

class Ragdoll {
    int age_ = -1;
public:
    Ragdoll(int age) /* noexcept */ : age_(age) {}

    int meow() const;
    int lose_hair();
};

template<typename Cat>
concept cat = requires(Cat cat) {
    noexcept(Cat{42});
    { cat.meow() } -> std::same_as<int>;
};

static_assert(cat<Ragdoll>);

noexcept表达式在概念中做什么?(随意也链接任何好的概念教程)

axr492tv

axr492tv1#

您可以检查表达式是否为noexcept,在一个requires expression中,noexcept->;之前:

template<typename Cat>
concept cat = requires(const Cat cat) {
    { Cat{42} } noexcept;
    // If you wanted the member function to be noexcept too for example
    { cat.meow() } noexcept -> std::same_as<int>;
};
55ooxyrt

55ooxyrt2#

好吧,显然下面的工作(在这个意义上,它触发了static_assert),虽然我更喜欢以某种方式在requires子句中指定它。

template<typename Cat>
concept cat = noexcept(Cat{42}) && requires(Cat cat) {
    { cat.meow() } -> std::same_as<int>;
};

相关问题