我对以下代码感到相当惊讶:
#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
?
结果是正确的。
参考文献永远不是
const
,因为它们不能是 cv 限定。您说它们不能被重新分配(并且因此在某种意义上是不可变的)是正确的,但这与 const
限定不同。
如果你得到
true
纯粹是因为所指是const
,那么这将与is_const
在所有其他情况下的含义完全不一致。例如,考虑指针。 is_const<int const*>::value
应该是什么?