Почему std :: is_const :: Значение оценивают false?
-
21-12-2019 - |
Вопрос
Это спин от вопроса Как проверить, является ли объект const или нет? .
Я был удивлен, увидев следующую программу
#include <iostream>
#include <type_traits>
int main()
{
std::cout << std::boolalpha;
std::cout << std::is_const<const int&>::value << "\n";
}
.
Произведен этот выход
false.
В каком контексте это имеет смысл думать о const int&
в качестве типа без константа?
Решение
Возможно, это будет легче понять с этим примером
std::cout << std::is_const<int const *>::value << "\n"; // pointer to const int
std::cout << std::is_const<int * const>::value << "\n"; // const pointer to int
.
Выход:
false
true
.
Первый тип представляет собой указатель на генеракодицетагкод, а во втором сам генеракодицетагCode является генеракодицетагкодом.Следовательно, это приводит к генеракодичеству, в то время как первый является GeneracodicCode.Точно так же, что у вас есть ссылка на генеракодицетагкод.Если const int
были действительными, это приведет к генеракодичениюCode.
Другие советы
Квалификатор const
по ссылке справедливо означает, что значение не может быть изменено через ссылку .Это все еще может быть изменено другими способами.Например:
int a = 1;
const int &b = a;
std::cout << b << std::endl; // Prints 1
a = 2;
std::cout << b << std::endl; // Prints 2
.
Таким образом, вы не можете предположить, что значение ссылки на генеракодицетагкод на самом деле постоянна.