0x6*_*773 7 c++ templates type-traits c++11
在下面的代码我已经使用std::remove_const和std::remove_reference,但在不同的顺序在两种情况下被赋予不同的结果:
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <type_traits>
using namespace std;
int main()
{
vector<string> ar = {"mnciitbhu"};
cout<<boolalpha;
cout<<"First case : "<<endl;
for(const auto& x : ar)
{
// Using std::remove_const and std::remove_reference
// at the same time
typedef typename std::remove_const<
typename std::remove_reference<decltype(x)>::type>::type TT;
cout<<std::is_same<std::string, TT>::value<<endl;
cout<<std::is_same<const std::string, TT>::value<<endl;
cout<<std::is_same<const std::string&, TT>::value<<endl;
}
cout<<endl;
cout<<"Second case : "<<endl;
for(const auto& x : ar)
{
// Same as above but the order of using std::remove_reference
// and std::remove_const changed
typedef typename std::remove_reference<
typename std::remove_const<decltype(x)>::type>::type TT;
cout<<std::is_same<std::string, TT>::value<<endl;
cout<<std::is_same<const std::string, TT>::value<<endl;
cout<<std::is_same<const std::string&, TT>::value<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
First case :
true
false
false
Second case :
false
true
false
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么使用std::remove_const和std::remove_reference以不同的顺序产生不同的结果?既然我要删除引用和const-ness,结果应该不一样吗?
Pra*_*ian 16
remove_const只会删除顶级 const限定符(如果存在).在const std::string&,const它不是顶级的,因此应用remove_const对它没有影响.
当你颠倒订单并remove_reference先申请时,结果类型是const string; 现在const是顶级和后续应用程序remove_const将删除const限定符.
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |