我在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在這種情況下編譯器如何處理?
uj5u.com熱心網友回復:
既然
std::vector<int>::pointer = int*,為什么const std::vector<int>::pointera 被解釋為int*而不是const int*?
因為const std::vector<int>::pointer將被解釋為int* const而不是const int*. 向指標添加const-qualifier 使其自身不可修改,而不是它指向的值。
如果你需要const int*,那么你應該使用std::vector<int>::const_pointer而不是const std::vector<int>::pointer.
uj5u.com熱心網友回復:
為什么 const
std::vector<int>::pointer a被解釋為 int* 而不是 const int*?
因為std::vector<int>::pointer是int*。一個符合條件的 constint*是int* const. 它不是const int*akaint const *是一種獨特的型別。但是引數的 const 對模板的推導沒有影響,所以不會推導為int* const.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/473706.html
