为什么不将 const 引用视为使用 is_const 类型特征的 const?
Why isn't a const reference considered const using the is_const type trait?
我很惊讶下面的代码:
#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
,我希望它是 return,因为引用 AFAIK 不能是 "reassigned"。
为什么 return false
而不是?
结果正确。
参考文献永远不会 const
,因为它们不能 cv-qualified。你说它们不能被重新分配是正确的(并且在某种意义上是不可变的),但这与 const
-qualified 不同。
如果你得到true
纯粹是因为referent是const
,那和is_const
的意思完全不符所有其他情况。例如,考虑指针。 is_const<int const*>::value
应该是什么?
我很惊讶下面的代码:
#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
,我希望它是 return,因为引用 AFAIK 不能是 "reassigned"。
为什么 return false
而不是?
结果正确。
参考文献永远不会 const
,因为它们不能 cv-qualified。你说它们不能被重新分配是正确的(并且在某种意义上是不可变的),但这与 const
-qualified 不同。
如果你得到true
纯粹是因为referent是const
,那和is_const
的意思完全不符所有其他情况。例如,考虑指针。 is_const<int const*>::value
应该是什么?