C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
C++ partial concept id: What is the reason for the explicit template specification order / special status of first argument?
我开始尝试概念的 C++20 功能,当我意识到可以为概念部分显式提供模板参数时,我感到非常高兴。我阅读了 cpp偏好文章,但没有找到那里提到的内容。
但后来我意识到一些奇怪的事情:模板参数的规范顺序与我的预期相反。当提供一个显式模板参数时,它会替换模板列表中的第二个模板:
#include <concepts>
#include <type_traits>
/// Concept in order to deduce if sth. is base of sth else
template <typename Impl, typename Base> //XXX: here the order of Impl and Base are not
concept Implements = std::is_base_of_v<std::remove_reference_t<Base>, // what I would've expected.
std::remove_reference_t<Impl>>;
/// Example Base class impl
struct BaseExample {};
/// Implementation of BaseExample
struct ImplExample : BaseExample {};
/// Function in which the concept is applied
template <Implements<BaseExample>... Baes> void f(Baes &&... ) {}//} ((void)b, ...); }
int main() {
(void) std::is_base_of_v<BaseExample, std::remove_reference_t<ImplExample &&>>; //< true
(void) std::is_base_of_v<BaseExample, std::remove_reference_t<ImplExample&>>; //< true
f(ImplExample{}, ImplExample{});
}
从我的角度来看,部分提供显式模板参数的可能性是有意义的,因为反对类的部分模板规范的论点在这里不适用,并且使概念更加通用。现在我想知道:
- 发布标准时,是否允许部分显式模板规范(可能(?
- 这个规范顺序可能会保持不变还是这是一个错误?
- 我该如何为自己回答这个问题?据我了解,c++20 标准现在还没有准备好,我找到了一份C++标准委员会论文的列表,其中我简要搜索了 2020 年提出的"概念"论文的标题。检查这些论文是要走的路,还是有一份可访问的单一文件,结合了作者目前同意的要点?
代码可以在这里找到。
编辑发布此内容后,我检查了指定三个模板参数时的行为。看起来我误解了规范顺序:第一个参数是"自由的"以包含要检查的参数,显式规范以第二个参数开头。这可以在这里看到。 即使我弄清楚了规范顺序背后的原因,我也会对上述问题的答案非常感兴趣。
是的,部分概念 id肯定是 C++20 的事情。 第一个论点的特殊地位虽然令人惊讶,但允许像std::constructible_from
这样的情况被宣布为
template<class T,class ...Args>
concept constructible_from=…;
std::constructible_from<int,int>
是一个类型约束,它要求它引入的任何内容都可以从两个int
参数构造。 但是,它也可以是表达式,在这种情况下,它会报告是否可以从int
构造int
(剧透:true
(,但无论参数顺序如何,都存在潜在的混淆。
如果T
必须放在最后,就没有办法使用这样的概念:只有模板参数推导或默认模板参数可以为参数包之外的模板参数提供值,而这些都不适用于此处。
在您链接的论文网站上发布的每封邮件都包括标准的最新草案,备用邮件包括有关采用哪些论文的注释。 或者你可以访问草稿的存储库(至少如果你喜欢阅读LaTeX的话(。
相关文章:
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- std::find,返回所有找到的值的替代方法,而不仅仅是存在重复的向量的第一个值
- 将可变参数从一个函数传递到另一个函数
- 如何仅读取文本文件中的第一个值
- 在C++中,如何在第一个"system()"结束后执行第二个"system()"?
- C++ 如何根据作为输入传递的参数调用一个构造函数或另一个构造函数?
- 查找不在标准中的第一个值::设置<int>最小-最大值
- C++:忽略第一个 cin.ignore 之后的输入
- 将参数从一个函数传递到另一个函数(没有模板) - C++
- 在C++中打印多个矢量的第一个值
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- C++第一个cout将不会打印
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 用输出参数包装一个c++函数,以便在javascript/node中使用
- OpenGL:第二个VBO破坏了第一个VBO
- 为什么第一个Dynamic_cast没有投射到基类?
- OpenGL 2D游戏只绘制第二个精灵纹理而不是第一个
- C++ 为什么程序只读取第一个值
- 将 std::string 作为参数从一个 DLL 传递到另一个 DLL 引发访问冲突错误
- 将参数初始化为构造函数,而不是第一个