Я был довольно удивлен, что следующий код:
#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
?