为什么is_base_of在只是普通的char类型时失败

my_*_*ion 5 c++

你明白为什么static_assert失败了:

template <typename T>
void 
foo(const T &c)
{

    static_assert(std::is_base_of<T, char>::value, "T must be char");  // Fails !

}

int main()
{
    char c = 'a';

    foo<char>(c);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我交换了T和"char",仍然失败了.

per*_*eal 5

您可能需要考虑添加其他检查:

template <typename T> void foo(const T &c) 
{
    static_assert(
            std::is_base_of<T, char>::value || std::is_same<T, char>::value, 
            "T must be char");

}
Run Code Online (Sandbox Code Playgroud)

但如果你只关心字符,那么你可以做:

static_assert(std::is_same<T, char>::value, "T must be char");
Run Code Online (Sandbox Code Playgroud)

还要考虑is_fundamental,以及is_convertible更复杂的断言.


qua*_*dev 4

状态的文档std::is_base_of

如果 Derived 派生自 Base 或者两者是相同的非联合类,则提供等于 true 的成员常量值。否则值为假。

char不是一个类:它是一个原始类型,所以这是预期的结果。

  • 为什么首先要放置模板?只需声明一个采用 char 的函数,不是吗? (3认同)