为什么C++没有std::invocable_r概念?

问题描述 投票:0回答:1

C++20 添加了概念,标准库中包含了相当多的概念。有一个概念特别引起了我的注意:std::invocable,它验证可以使用一组参数来调用函子。

std::invocable
只是
std::is_invocable
的语法糖。然而,标准库进一步定义了
std::is_invocable_r
,它测试函子是否可以用一组参数调用,而且一旦调用它就返回某种类型。这两个实用程序还有
nothrow
版本。然而,标准中没有定义等效的概念。

标准没有定义这些概念是否有原因,或者只是一个疏忽?是否有一些普通读者没有注意到的细节导致委员会决定不包括这些?

c++ c++20 language-design c++-concepts
1个回答
0
投票

概念库的设计方法比类型特征的设计方法要简约得多。例如,没有

std::arithmetic
概念来匹配
std::is_arithmetic
特征。这有两个原因:

  1. 它可以简单地由
    std::is_arithmetic
    std::is_integral
    std::is_floating_point
  2. 构造而成
  3. 尚不清楚应首选这些结构中的哪一个

std::invocable
及其
_r
nothrow
变体也存在类似的问题。你可以简单地构建一个这样的概念:

template <typename T, typename R, typename... Args>
concept invocable_r = invocable<T, Args...> && requires (Args&&... args) {
    { invoke(forward<Args>(args...)) } -> convertible_to<R>;
};

但是,目前还不清楚这是否是最终的实现。你也可以用

std::invoke_r
来构造它,目前还不清楚是否还应该使用
std::convertible_to

总而言之,概念库不包含存在以下问题的概念:

  1. 这个概念可以很容易地从其他概念构建出来,所以它只是为了方便而存在。这包括

    nothrow
    变体、
    _r
    变体、
    std::arithmetic
    等连词等。用户可以自己制作这些。

  2. 有多种可能的实现,并且尚不完全清楚哪一种应该进入标准库。请记住,定义概念的确切方式可能会使其比另一个概念受到更多限制,因此实现细节很重要。

最后但并非最不重要的一点是,请记住标准化任何语言功能都是一项艰巨的任务。提案越细小,就越容易获得委员会的通过。如果现在有人提出一个提供此类便利概念的提案,那么它很有可能会取得成功,但是,在当时,这将是一项艰巨的任务,这会大大增加提案的规模。

© www.soinside.com 2019 - 2024. All rights reserved.