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

问题描述 投票:0回答:1

我对以下代码感到相当惊讶:

#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

c++ c++11 type-traits
1个回答
3
投票

结果是正确的。

参考文献永远不是

const
,因为它们不能是 cv 限定。您说它们不能被重新分配(并且因此在某种意义上是不可变的)是正确的,但这与
const
限定不同。

如果你得到

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

© www.soinside.com 2019 - 2024. All rights reserved.