为什么 C++ 概念返回类型要求是类型约束而不是原始类型?

Cos*_*ito 11 c++ c++11 c++20

大家好,概念现在是 C++20 标准的一部分,为了使用它,我基本上写了这个我之前看到的示例

#include<iostream>

template<typename T>
concept Container= requires (T a){

    { a.size() } -> size_t;
    // others
}

template<Container Holder>
class Demo{};
int main(){


    Demo<std::vector<int>> d;


}
Run Code Online (Sandbox Code Playgroud)

但是在编译代码时我收到以下错误

错误:返回类型要求不是类型约束 ( { a.size() } -> size_t;)

后来我记得返回类型约束不能是原始类型,并用 std::same_as 更改了代码

#include<iostream>

template<typename T>
concept Container= requires (T a){

    { a.size() } -> std::same_as<size_t>;
    // others
}

template<Container Holder>
class Demo{};
int main(){

    Demo<std::vector<int>> d;

}
Run Code Online (Sandbox Code Playgroud)

其中 std::same_as 本身就是一个概念。

但为什么不能使用原始类型呢?我知道它破坏了 C++ 中的某些内容,但我不记得了。

cpp*_*ner 10

因为语义不明确:是否{ a.size() } -> size_t意味着 的结果a.size()可以转换为 size_t,或者decltype(a.size())完全相同 size_t

因此,必须使用约束来明确意图(convertible_to对于前者,same_as对于后者)。

  • 这应该意味着它是完全相同的,默认情况下隐式转换是不好的。现在每个人都必须到处写same_as&lt;T&gt;,就好像委员会故意设计冗长一样。 (2认同)