2015-12-05 1 views
1

я был весьма удивлен, что следующий код:Почему ссылка const не считается const с использованием свойства типа is_const?

#include <iostream> 
#include <type_traits> 

using namespace std; 

int main(int argc, char* argv[]) { 
    cout << boolalpha << is_const<const float&>::value << endl; 

    return 0; 
} 

Печать false. Удаление ссылок работает правильно:

#include <iostream> 
#include <type_traits> 

using namespace std; 

int main(int argc, char* argv[]) { 
    cout << boolalpha << is_const<remove_reference<const float&>::type>::value << endl; 

    return 0; 
} 

Распечатка true.

Оба были составлены с g++ -std=c++11 test.cpp, используя G ++ версии:

g++ (Ubuntu 5.3.0-1ubuntu1~14.04) 5.3.0 20151204 

Думая об этом, я могу понять, что существует два типа в игре здесь: тип ссылки и тип, на который ссылается. Тип, на который ссылаются, равен const, поэтому второй случай имеет смысл. В первом случае я бы ожидал, что он вернется, если ссылочный тип равен const или всегда true, потому что ссылки AFAIK не могут быть «переназначены».

Почему он возвращает false?

ответ

3

Результат исправит.

Ссылки не всегда const, потому что они не могут быть cv-certified. Вы правильно говорите, что их нельзя переназначить (и, как таковые, неизменны в некотором смысле), но это не то же самое, что и const -qualified.

Если вы получили true чисто потому, что референт является const, то это было бы совершенно несовместимо со значением is_const во всех остальных случаях. Рассмотрим, например, указатели. Что должно быть is_const<int const*>::value be?

+1

Спасибо за ответ. Пример указателя действительно сделал это! –