【发布时间】:2020-05-14 02:26:38
【问题描述】:
给定:
#include <concepts>
#include <iostream>
template<class T>
struct wrapper;
template<std::signed_integral T>
struct wrapper<T>
{
wrapper() = default;
void print()
{
std::cout << "signed_integral" << std::endl;
}
};
template<std::integral T>
struct wrapper<T>
{
wrapper() = default;
void print()
{
std::cout << "integral" << std::endl;
}
};
int main()
{
wrapper<int> w;
w.print(); // Output : signed_integral
return 0;
}
根据上面的代码,int 符合std::integral 和std::signed_integral 的概念。
令人惊讶的是,这会在 GCC 和 MSVC 编译器上编译并打印“signed_integral”。我原以为它会因“模板专业化已被定义”的错误而失败。
好的,这很合法,也很公平,但为什么选择std::signed_integral 而不是std::integral?当多个概念符合模板参数时,标准中是否定义了任何规则以及选择模板专业化的规则?
【问题讨论】:
-
我不会仅仅因为编译器接受它就说它是合法的,尤其是在采用它的早期阶段。
-
@Slava 在这种情况下,概念经过精心设计,因此它们以直观的方式相互包含
-
@GuillaumeRacicot 很好,我只是评论说“这是合法的,因为编译器接受了它”这个结论可以说是误导。我并没有说这是不合法的。
标签: c++ language-lawyer c++20 c++-concepts