"typename ="在模板参数中的含义是什么?

qft*_*qft 28 c++ templates metaprogramming generic-programming

我在"Effective Modern C++"一书的第189页中看到过这个表达式:

    template<typename T,
             typename = typename std::enable_if<condition>::type>
    explicit Person(T&& n);
Run Code Online (Sandbox Code Playgroud)

我只是想知道" typename =" 这个部分是什么意思.它当然看起来像模板参数的默认参数.但是你不需要typename some_name = ...在默认参数中使用" " 这样的东西吗?第二个模板参数没有名称,我没有看到在这种情况下使用的第二个模板参数.

PS当我在谷歌(或任何其他搜索引擎)上搜索答案时,等号总是被丢弃,这只是让找到答案几乎不可能......

SLa*_*aks 19

这是一个可选的模板参数,没有名称和默认值.
它用于应用enable_if条件; 如果不满足条件,它将创建编译器错误.

您可以对普通方法参数使用完全相同的语法.

  • 为了澄清这一短语:“如果不满足条件,它将产生编译器错误”:可以说这会触发SFINAE(“替代失败不是错误”)并且未定义构造函数吗?(我对SFINAE有点陌生。) (2认同)