【发布时间】:2022-01-10 17:48:33
【问题描述】:
假设我有这个:
template<typename T>
class my_template {...};
现在,预计用户可以将my_template 专门用于他们自己的类型。他们会将这些类型传递给我的一些 API 函数,它们将使用 my_template<T> 的属性来做事。
所以在我的代码中的某个时刻,我有一个my_template<T>。如果my_template<T> 是用户提供的专业化(部分或显式)和false 如果不是.
最明显的解决方案是将私有成员别名或其他一些 concept-detectable 私有声明推入主要的 my_template 定义中,并依赖于用户提供的专业化中不存在的内容。但是,用户可以通过提供适当的定义来伪造明确的专业化。所以这不是万无一失的。
这个问题不是诡辩。 C++20 规范有一个元函数ITER_CONCEPT(I),根据std::iterator_traits<I> 是来自主模板还是用户提供的特化,它具有不同的内部行为。当然,作为标准库,他们可以创建一个前缀为 __ 的标识符作为主模板的成员,从而将来自用户空间的任何试图伪造声明为未定义行为。
这是只有编译器/标准库实现才能万无一失的事情,还是可以在 C++20 中做到这一点?
【问题讨论】: