为什么不使用is_const类型特征将const引用视为const?

时间:2015-12-05 15:11:15

标签: c++ c++11 typetraits

我对以下代码感到非常惊讶:

#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

1 个答案:

答案 0 :(得分:3)

结果是正确的。

引用永远不会const,因为它们不能是 cv-qualified 。你说它们不能被重新分配是正确的(并且因此在某种意义上是不可改变的),但这与const合格是不一样的。

如果你true纯粹是因为指示const,那么在所有其他情况下,这与is_const的含义完全不一致。例如,考虑一下指针。 is_const<int const*>::value应该是什么?