【发布时间】:2019-09-25 16:38:03
【问题描述】:
对于 C++20 的概念,一些编译器已经为它提供了一些早期的实现。我们在参数有约束的模板类的友元声明中遇到了一些问题。经过一番深思熟虑并试图在标准草案和相关文档中找到任何内容后,我们对可能和/或正确的内容并不明智。
我们已经尝试了可以找到解决方案的标准想法,但没有得出任何适用于所有尝试过的编译器或标准的正式答案的方法,这可能只是阅读正确搜索时运气不佳结果。
我们尝试尝试在模板类与其自身之间创建朋友关系,使模板的所有其他实例成为朋友。
原版的样子
template <typename T> concept Constraint = true;
template <Constraint T>
class A { };
struct B {
template <typename>
friend class A;
};
这在 gcc 中编译,但在 clang 和最新的 MSVC 预览编译器中都没有
下一个尝试是在朋友声明中使用约束,即
template <typename T> concept Constraint = true;
template <Constraint T>
class A { };
struct B {
template <Constraint>
friend class A;
};
这看起来是一种很自然的方式,因为朋友只能在满足约束条件下被实例化。
这通过 gcc,clang 对此不满意,MSVC 还可以。使用声明,但在实际尝试使用它时失败。它抱怨约束没有得到满足,这是不正确的。
还有人想出将一些类 id 放入朋友声明中,即
template <typename T> concept Constraint = true;
template <Constraint T>
class A { };
struct B {
template <Constraint U>
friend class A;
};
这与上一次尝试的结果相同。 到目前为止,我们还没有想出一个真正有效的语法(如果可能的话)。 如果不使用约束并使用 SFINAE 技巧并仅使用“typename”,它会按预期工作。
如果有人知道如何使用实际的 C++20 功能或实际描述该情况的指针来修复它,我们将不胜感激。我们知道我们可以只使用 setter 和 getter,但这不是重点。
【问题讨论】:
标签: c++ friend c++20 c++-concepts