相关疑难解决方法(0)

C++20 概念:当模板参数符合多个概念时,选择哪个模板特化?

鉴于:

#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;
}
Run Code Online (Sandbox Code Playgroud)

从上面的代码中,int符合std::integralstd::signed_integral概念。

令人惊讶的是,这会在 GCC 和 MSVC 编译器上编译并打印“signed_integral”。我原以为它会失败,并出现“模板专业化已经定义”的错误。

好的,这是合法的,足够公平,但为什么std::signed_integral选择而不是std::integral?当多个概念符合模板参数的条件时,标准中是否定义了任何规则来选择模板特化?

c++ language-lawyer c++-concepts c++20

24
推荐指数
2
解决办法
1496
查看次数

标签 统计

c++ ×1

c++-concepts ×1

c++20 ×1

language-lawyer ×1