我对以下代码感到非常惊讶:
#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
?
答案 0 :(得分:3)
结果是正确的。
引用永远不会const
,因为它们不能是 cv-qualified 。你说它们不能被重新分配是正确的(并且因此在某种意义上是不可改变的),但这与const
合格是不一样的。
如果你true
纯粹是因为指示是const
,那么在所有其他情况下,这与is_const
的含义完全不一致。例如,考虑一下指针。 is_const<int const*>::value
应该是什么?