C++;如果原型是本地的,则使用流I/O的类型约束将失败 在下面的MCVE中,C++没有识别到“代码”> INT/C>> S可以用流I/O打印或打印,但它认为代码< A/COS> S不能,尽管原型代码代码/代码> > < /P>

C++;如果原型是本地的,则使用流I/O的类型约束将失败 在下面的MCVE中,C++没有识别到“代码”> INT/C>> S可以用流I/O打印或打印,但它认为代码< A/COS> S不能,尽管原型代码代码/代码> > < /P>,c++,c++20,c++-concepts,C++,C++20,C++ Concepts,如果我将原型和类设置为全局,那么问题就解决了(对于第二行输出,它将打印11,而不是00) 显然,我会让原型正常地全球化。但我不知道范围规则如何让约束知道它是在哪里定义的,只要它是定义的。当原型是本地的时,它为什么不工作?在两个表达式中--In>>t和out>和操作符 #include <iostream> using namespace std; template<typename T> concept Readable = requires(std::istream

如果我将原型和类设置为全局,那么问题就解决了(对于第二行输出,它将打印
11
,而不是
00

显然,我会让原型正常地全球化。但我不知道范围规则如何让约束知道它是在哪里定义的,只要它是定义的。当原型是本地的时,它为什么不工作?

在两个表达式中--
In>>t
out>
操作符
#include <iostream>

using namespace std;

template<typename T>
concept Readable = requires(std::istream& in, T& t)
{
    in >> t;
};

template<typename T>
concept Printable = requires(std::ostream& out, T t)
{
    out << t;
};

int main()
{
    class A {};
    ostream& operator<< (ostream&, const A&);
    istream& operator>> (istream&, A&);

    std::cout << Readable<int> << Printable<int> << '\n';
    std::cout << Readable<A>   << Printable<A>   << '\n';

    return 0;
}
11
00