为什么 is_integral_v<string> 是真的?

Edu*_*yan 3 c++ templates c++11

我想问题的标题没有多大意义,但我希望问题描述能够传播光。
有人可以解释一下这到底是如何通过编译的吗?

template<typename Cont, typename = std::enable_if<std::is_integral_v<std::string>>>
void print(const Cont& cont) 
{
    for (const auto it : cont) {
        cout << it << " ";
    }
    cout << endl;
}

int main()
{
    std::vector<string> V;
    print(V);
}
Run Code Online (Sandbox Code Playgroud)

最初的版本是:
template<typename Cont, typename = std::enable_if<std::is_integral_v<typename Cont::value_type>>>
我只是明确地把 std::string 确定下来。

我猜 enable_if 应该完全禁止实例化这个函数?
我在这里缺少什么?

Use*_*ess 13

std::enable_if<false>仍然作为一种类型存在,这就是您推断出未使用的类型参数的内容。

它只是作为一种本身没有嵌套公共成员 typedef 的类型存在type。这就是为什么您必须使用std::enable_if<EXPR>::typestd::enable_if_t<EXPR>获得您期望的行为。

您可以在文档中查看您的用例的示例。


只是为了完整性:

为什么 is_integral_v 是真的?

不是!你只是没有检查你认为你是什么。

在将来,当您遇到的是这样的(它可以是真的很难看到有什么不对,当你知道你的意思写的),试图寻找另一种方式来测试你的假设。你可以打印出来is_integral_v<std::string>看看它是真的还是假的。

或者,当然,请其他人看一下。其他人通常可以立即看到我们的大脑帮助过滤掉的错误。