2014-06-04 1 views
7

Это спина от вопроса How to check if object is const or not?.Почему std :: is_const <const int&> :: значение оценивается как false?

Я был удивлен увидеть следующую программу

#include <iostream> 
#include <type_traits> 

int main() 
{ 
    std::cout << std::boolalpha; 
    std::cout << std::is_const<const int&>::value << "\n"; 
} 

произвел этот выход

 
false 

В каком контексте это имеет смысл думать о const int& как неконстантного типа?

+9

'is_const ' определяется как «T является const-квалифицированным». Ссылки не могут быть cv-квалифицированными, поэтому это имеет смысл с точки зрения языка. – Mat

+0

См. Также http://stackoverflow.com/questions/6217453/why-does-boostis-sameint-const-boostadd-constint-value-equal-false?rq=1 – MSalters

+0

@Mat, не могли бы вы перевести свой комментарий на ответ? Это, кажется, содержит лучший ответ. –

ответ

13

Возможно, это будет легче понять этот пример

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 

Первый тип является указателем на const int, а во втором сам int *const является , Следовательно, это приводит к true, а первый - false. Точно так же у вас есть ссылка на const int. Если int& const действительны, это приведет к true.

+0

Поскольку переменная типа ссылки не может быть сделана ссылкой на другой объект после ее инициализации, это имеет смысл для 'std :: is_const :: value', а также' std :: is_const :: value' для оценки «true», чем «false». –

+0

@RSahu Я не понимаю, почему вы так думаете. Как я уверен, вы понимаете, что 'const' в' int const & 'указывает, что' int' не может быть изменен. Цель 'is_const' заключается в том, чтобы указать, является ли * T const-qual * (цитируется из 20.10.4.3). В обоих случаях вы указали 'T = int &'; ясно, что 'T' не' const'. Было бы противно интуитивно, чтобы он возвращал «истину» в любом случае. – Praetorian

+0

Я понимаю это. Возможно, мне трудно обосновать его определенное поведение. Для меня имеет смысл думать, что константа ссылочной переменной будет такой же, как константа типа, который она ссылается. –

0

A const квалификатор по ссылке означает, что значение не может быть изменено по ссылке. Его все еще можно изменить другими способами. Например:

int a = 1; 
const int &b = a; 

std::cout << b << std::endl; // Prints 1 

a = 2; 

std::cout << b << std::endl; // Prints 2 

Таким образом, вы не можете предположить, что значение const ссылки фактически постоянным.

+2

Не знаю, почему это привлекло нисходящее. Он корректно утверждает, что 'const' здесь применим только к типу выражений, включающих' b'. Ни '' ', ни' '' '' '' сами'''''''''.(Тем не менее, ответ Преториан намного яснее) – MSalters

+2

Это правда, но не имеет ничего общего с вопросом –

 Смежные вопросы

  • Нет связанных вопросов^_^