了解void f(const T& param)中param的类型

4

参考:《Effective Modern C++》第4条。

https://github.com/BartVandewoestyne/Effective-Modern-Cpp/blob/master/Item04_Know_how_to_view_deduced_types/runtime_output02.cpp

这段内容讲述了如何查看使用类型推导后的类型。建议阅读参考文献以获得更多信息。
class Widget {};

template<typename T>                // template function to
void f(const T& param)              // be called
{
}

std::vector<Widget> createVec()    // factory function
{
    std::vector<Widget> vw;
    Widget w;
    vw.push_back(w);
    return vw;
}

int main()
{
    const auto vw = createVec();        // init vw w/factory return

    if (!vw.empty()) {
      f(&vw[0]);                        // call f
      // ...
    }
}

根据该书,Tparam的类型分别如下:

T = class Widget const *
param = class Widget const * const &

我有困难理解为什么上面定义的 f(const T& param) 中的 param 是给定类型。

这是我的理解,

T = class Widget const *

那么f(const T& param)变成了以下内容:

f(const Widget * const & param).

为什么param的实际类型是Widget const * const &而不是其他类型呢?


T = class Widget const * param = class Widget const * 在Visual Studio 2017 RC上 - Loreto
2个回答

2
问题:为什么参数的真实类型是Widget const * const &,而不是其他类型?
我并不是专家,但是......因为T是一个指针,如果你写const T&(也就是T const&,因为规则是const应用于左边的元素或者右边的元素,如果没有元素在左边),你就强制整个T类型都是常量,因此指针也是常量。为了使指针成为常量,你必须在*的左侧加上const。
简而言之,const T&相当于T const&;对于T是const Widget *的情况,T const&变成了const Widget * const &,或者如果你喜欢,也可以写成Widget const * const &。

2
您对于“常量指针”和“指向常量的指针”(以及“常量指针指向常量”的区别)感到困惑。
请注意“*”和“const”的位置。例如,“Widget const *”是指向常量(“Widget”)的非常量指针,“Widget * const”是指向非常量(“Widget”)的常量指针,“Widget const * const”是指向常量(“Widget”)的常量指针。
对于“T = Widget const *”,它是指向常量的非常量指针;请注意,对于“const T”,“const”是限定在指针本身上,而不是所指对象上。因此,“const T”将是“Widget const * const”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接