Почему ссылка на константу не считается константой с использованием признака типа 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?


person Janito Vaqueiro Ferreira Filho    schedule 05.12.2015    source источник


Ответы (1)


Исход правильный.

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

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

person Lightness Races in Orbit    schedule 05.12.2015
comment
Спасибо за ответ. Пример указателя действительно сделал дело! - person Janito Vaqueiro Ferreira Filho; 05.12.2015