模板如何推导出 const 指针类型?
How template deduce const pointer type?
我试过 cppinsights 中的以下代码:
#include <iostream>
#include <string>
#include <type_traits>
#include <vector>
template<typename T>
void printType(T x) {
std::cout << typeid(x).name() << std::endl;
}
void test() {
const std::vector<int>::pointer a = new int[2];
const int* c = new int[2];
printType(a);//line15
printType(c);//line16
//delete
}
int main() {
test();
}
输出如下:
/* First instantiated from: insights.cpp:15 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void printType<int *>(int * x)
{
std::operator<<(std::cout, typeid(x).name()).operator<<(std::endl);
}
#endif
/* First instantiated from: insights.cpp:16 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void printType<const int *>(const int * x)
{
std::operator<<(std::cout, typeid(x).name()).operator<<(std::endl);
}
#endif
既然std::vector<int>::pointer
= int*
,为什么const std::vector<int>::pointer a
被解释为int*
而不是const int*
?
顺便说一句:如果 pointer
被 value_type
替换,它们将被推断为 int
而不是 const int
。
在这种情况下,编译器如何处理 const
?
why const std::vector<int>::pointer a
has been interpreted as int* instead of const int*?
因为std::vector<int>::pointer
是int*
。限定 int*
的 const 是 int* const
。它不是 const int*
又名 int const *
,它是一种独特的类型。但是参数的常量性对模板的推导没有影响,所以不会推导为int* const
.
Since std::vector<int>::pointer = int*
, why const std::vector<int>::pointer
a has been interpreted as int*
instead of
const int*
?
因为 const std::vector<int>::pointer
将被解释为 int* const
而不是 const int*
。向指针添加 const
限定符使其自身不可修改,而不是它指向的值。
如果您需要 const int*
,那么您应该使用 std::vector<int>::const_pointer
而不是 const std::vector<int>::pointer
。
我试过 cppinsights 中的以下代码:
#include <iostream>
#include <string>
#include <type_traits>
#include <vector>
template<typename T>
void printType(T x) {
std::cout << typeid(x).name() << std::endl;
}
void test() {
const std::vector<int>::pointer a = new int[2];
const int* c = new int[2];
printType(a);//line15
printType(c);//line16
//delete
}
int main() {
test();
}
输出如下:
/* First instantiated from: insights.cpp:15 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void printType<int *>(int * x)
{
std::operator<<(std::cout, typeid(x).name()).operator<<(std::endl);
}
#endif
/* First instantiated from: insights.cpp:16 */
#ifdef INSIGHTS_USE_TEMPLATE
template<>
void printType<const int *>(const int * x)
{
std::operator<<(std::cout, typeid(x).name()).operator<<(std::endl);
}
#endif
既然std::vector<int>::pointer
= int*
,为什么const std::vector<int>::pointer a
被解释为int*
而不是const int*
?
顺便说一句:如果 pointer
被 value_type
替换,它们将被推断为 int
而不是 const int
。
在这种情况下,编译器如何处理 const
?
why const
std::vector<int>::pointer a
has been interpreted as int* instead of const int*?
因为std::vector<int>::pointer
是int*
。限定 int*
的 const 是 int* const
。它不是 const int*
又名 int const *
,它是一种独特的类型。但是参数的常量性对模板的推导没有影响,所以不会推导为int* const
.
Since
std::vector<int>::pointer = int*
, whyconst std::vector<int>::pointer
a has been interpreted asint*
instead ofconst int*
?
因为 const std::vector<int>::pointer
将被解释为 int* const
而不是 const int*
。向指针添加 const
限定符使其自身不可修改,而不是它指向的值。
如果您需要 const int*
,那么您应该使用 std::vector<int>::const_pointer
而不是 const std::vector<int>::pointer
。