了解 const 限定符在指针的模板参数推导中的位置

Understanding const Qualifier Position in Template Parameter Deduction for Pointers

提问人:Sami 提问时间:11/6/2023 最后编辑:273KSami 更新时间:11/6/2023 访问量:66

问:

我正在努力了解 const 限定符如何影响 C++ 模板函数中的推导类型,尤其是在涉及指针时。请考虑以下模板函数:

#include <type_traits>
#include <iostream>
template <typename T>
void foo(const T val) {
    if (std::is_pointer<T>::value) {
        std::cout << "foo() called for a pointer" << std::endl;
    } else {
        std::cout << "foo() called for a value" << std::endl;
    }
}

int main() {
    int x = 10;
    int* y = &x;
    foo(y);
}

当我调用 foo(y) 时,y 是指向 int 的指针,我注意到 T 被推导为 ,并且函数参数 val 变为 。我想确认我的理解:int*int* const

为什么适用于指针本身,而不是指向类型(即,而不是)? C++ 标准中是否有一条规则来定义如何在此类模板类型推导中应用 const?constint* constconst int*

链接到 C++Insights : https://cppinsights.io/

这同样适用于:

#include <type_traits>
#include <iostream>
template <typename T>
void foo(const T& val)
{
    if (std::is_pointer<T>::value)
    {
        std::cout << "foo() called for a pointer" << std::endl;
    }
    else
    {
        std::cout << "foo() called for a value" << std::endl;
    }
}

int main()
{
    int x = 10;
    int*  y = &x;
    foo(y);
}
C++ 指针 模板 常量

评论

2赞 Sam Varshavchik 11/6/2023
出于同样的原因,为什么你最终会得到一个 Getting Defined,而不是 .这就是 C++ 的工作方式。typedef int *foo; const foo bar=nullptr;int * const barconst int *bar;
2赞 Brian61354270 11/6/2023
如果不声明为 const,会不会非常混乱?const T valval
1赞 JaMiT 11/6/2023
“为什么 const 适用于指针本身,而不是指向类型”——换句话说,为什么它适用于类型本身,而不是深埋在类型内部的东西?为什么你最终会分解成组件,然后在里面挑选一些东西来应用?constconst TTconst
1赞 zdf 11/6/2023
你怎么读?“v 是一个常数 T”。现在将“T”替换为“指针”,并将其转换回声明。你会得到什么?const T v
1赞 SoronelHaetir 11/6/2023
如果你想让它应用于更深层次的东西,可以这样写:将是一个指向常量T的指针(不管它是什么)。void foo(T const * ptr)

答: 暂无答案