【问题标题】:Is deduction of multiple template arguments in an explicit specialization of a function template allowed?是否允许在函数模板的显式特化中扣除多个模板参数?
【发布时间】:2019-06-26 12:09:23
【问题描述】:

以下引用来自[temp.expl.spec.11]

尾随 template-argument 可以在 template-id 中未指定,命名提供的显式函数模板特化 it 可以从函数参数类型推导出来。

表示只能推导出单个尾随模板参数。这会使以下示例代码不正确:

template <typename T1, typename T2>
void f(T1, T2*);  

template<>
void f(int, double*) { }

int main()
{
    auto d = 2.0;
    f(1, &d);
}

但是,使用 GCC 和 Clang 可以很好地编译代码。这些编译器是否应用了一些非标准的语言扩展,或者是否支持多个尾随参数的推导?

如果后者为真,为什么句子不形成如下?

尾随 template-arguments 可以在 template-id 中未指定,如果他们命名一个显式的函数模板特化strong> 可以从函数参数类型s推导出来。

【问题讨论】:

    标签: c++ language-lawyer template-specialization template-argument-deduction function-templates


    【解决方案1】:

    开头的“a”指的是any而不是one

    A[ny] 尾随 template-argument 可以在命名显式函数模板特化的 template-id 中未指定,前提是它可以从函数参数类型推导出来.

    这是我刚刚编的一句话:

    函数参数的类型T调整为const T,然后再进行分析。

    这并不是说只调整众多参数中的一个,而是调整每一个;如果有的话,因为也可能没有参数。

    “a”在更一般的意义上是指任何一件事。

    【讨论】:

    • 感谢您的澄清。我不是母语人士,这些微妙之处有时仍然会给我带来麻烦。
    • @DanielLangr 哦,是的,我也是,我知道那种感觉——太糟糕了:(
    【解决方案2】:

    引号并不表示只能省略一个参数。

    如果可以从函数参数类型推导出来,则可以在命名显式函数模板特化的模板 ID 中未指定尾随模板参数。

    表示如果可以推导出一个(任何)参数,则可以省略它。所以在

    template<>
    void f(int, double*) { }
    

    我们不需要指定T1,因为它可以从int推导出来,我们不需要指定T2,因为它可以从double*推导出来。

    如果标准只允许不指定单个参数,它会这样写

    可以在命名显式函数模板特化的模板 ID 中未指定单个尾随模板参数,前提是它可以从函数参数类型推导出来。

    【讨论】:

    • 感谢您的澄清。我不是母语人士,这些微妙之处有时仍然会给我带来麻烦。
    • @DanielLangr 不用担心。我是一个母语人士,但它仍然不时给我带来麻烦。英语很古怪。
    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多