gpt4 book ai didi

c++ - 有没有办法改变概念内复合需求返回的类型?

转载 作者:行者123 更新时间:2023-12-02 11:41:20 24 4
gpt4 key购买 nike

我一直在研究概念,并发现了一些我不太确定的东西。采用以下代码( cppreference 指出“decltype((expression)) 必须满足类型约束所施加的约束”):

#include <concepts>

class Base { };
class Derived : public Base { };

template<typename T> concept C1 =
requires(T x) {
{x} -> std::derived_from<Base>; // decltype ((x)) returns Derived &
};

// This fails with error 'Base' is not a base of 'Derived&'
static_assert (C1<Derived>);

Code on Compiler Explorer

有没有办法对从 {x} 返回的类型或返回引用的任何表达式应用附加操作,例如 std::remove_reference_t ?干杯

最佳答案

您可以使用嵌套要求来应用概念检查之前需要执行的任何类型修改:

template<typename T> concept C1 =
requires(T x) {
requires std::derived_from<std::remove_reference_t<decltype((x))>, Base>;
};

(请注意,需要使用双括号来模仿复合要求中 {x} 的行为。)您可以将 x 替换为您在{x} 否则。

这也是复合表达式的主要作用。 [expr.primreq.compound]/1.3.2指定您在问题中的概念的行为类似于

template<typename T> concept C1 =
requires(T x) {
x;
requires std::derived_from<decltype((x)), Base>;
};

(根据引用的标准段落中的示例,我不完全确定为什么重复的简单要求是必要的,但我可能忘记了一些特殊情况。)

关于c++ - 有没有办法改变概念内复合需求返回的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59444542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com