【问题标题】:Explicit template function argument specification and Implicit conversion of function arguments in C++11C++11 中的显式模板函数参数规范和函数参数的隐式转换
【发布时间】:2012-12-26 04:52:57
【问题描述】:

题目很长很神秘,但问题比较简单。

我正在阅读最新的 C++11 规范草案 (N3242=11-0012),第 375 页中的 14.8.1 Explicit template argument specification

6 隐式转换(第 4 条)将在函数上执行 参数将其转换为相应函数的类型 如果参数类型不包含模板参数,则参数 参与模板参数推导。 [注:模板 参数不参与模板参数推导,如果他们 是明确指定的。例如,

template<class T> void f(T);
class Complex {
  Complex(double);
};
void g() {
  f<Complex>(1); // OK, means f<Complex>(Complex(1))
}

——尾注]

有人可以向我解释一下,它想说什么,以及示例中的转换发生在哪里。
谢谢!

【问题讨论】:

    标签: c++ templates stl c++11


    【解决方案1】:

    转换就在这里进行:

    f<Complex>(1);
    

    您正在调用一个函数 f,它需要一个 Complex,但您正在向它传递一个 int。有一个从intdouble标准转换和一个从doubleComplex用户定义转换

    该标准试图说明的是,当您显式向模板函数提供模板参数时,这些参数的行为就好像该函数是使用这些类型声明的一样。也就是说,当您调用 f&lt;Complex&gt; 时,它的行为就像已声明:

    void f( Complex );
    

    否则,如果没有显式指定模板参数,T 将被推断为int,并且不会发生隐式转换。

    【讨论】:

    • 如果我错了,请纠正我,但 explicitly provide template parameters 不应该是 explicitly provide template arguments,因为给出了显式模板参数 ?谢谢!
    • @newprint:当然,为什么不呢?我从来没有参与过 argument/parameter 区分船...我经常混合这些概念
    • 感谢回复详细回复! (我怀疑 Specs 编写者也会混合使用 arg/param 术语)
    • 参数是声明要接受的东西,参数是你实际传入的东西——非常简单。 :-]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多