2014-11-21 23 views
0

我們看到std::is_const<const int&>::value總是false。所以這條指令#1永遠不會執行。如何編寫is_reference_const函數,make is_reference_const <const int&> :: value`是ture

template <typename T> void g(T&& val) 
    { 
     if(is_const<T>::value) 
     { 
     #1 if(is_lvalue_reference<T>::value)cout<<"const l reference"<<endl; 
      else if(is_rvalue_reference<T>::value)cout<<"const r reference"<<endl; 
      else cout<<"const int"<<endl; 
     }else 
     { 
      if(is_lvalue_reference<T>::value)cout<<"l reference"<<endl; 
      else if(is_rvalue_reference<T>::value)cout<<" r reference"<<endl; 
      else cout<<" int"<<endl; 
     } 

    } 

爲什麼STL沒有提供is_reference_const此問題的功能?我們可以寫這個功能呢? 最後,這個函數如is_reference_const<const int&>::value是真的。

+0

隨意撰寫提案。儘管如此,製作你自己的應該是微不足道的。根據你的描述,你應該能夠將'std :: remove_reference'和'std :: is_const'結合起來。 – chris 2014-11-21 03:06:05

+0

謝謝。但如果(is_reference :: value) { cout <<「is reference」<< endl; if(is_const > :: value){cout <<「const reference」<< endl;} }不起作用。 – 2014-11-21 03:13:20

+0

我對這兩者的組合沒有任何問題。 – chris 2014-11-21 03:17:49

回答

1

任何事情都在標準中,因爲有人希望它在那裏,並把精力放在那裏,並說服委員會這是一個好主意。

這工作:

#include <type_traits> 
#include <iostream> 

template <typename T> 
struct is_reference_const 
{ 
     static const bool value = std::is_reference<T>::value && std::is_const<typename std::remove_reference<T>::type>::value; 
}; 

int main() 
{ 
     std::cout << is_reference_const<const int &>::value << std::endl; 
     std::cout << is_reference_const<const int>::value << std::endl; 
     std::cout << is_reference_const<int &>::value << std::endl; 
     std::cout << is_reference_const<int>::value << std::endl; 
} 

1 
0 
0 
0 

我感到驚訝的是is_const<const int&>::valuefalse

+0

你可以看到這個問題[爲什麼std :: is_const :: value評估爲false?](http://stackoverflow.com/questions/24029723/why-does-stdis-constconst-intvalue-evaluate-to-false ) – 2014-11-21 03:35:53

+0

感謝您的answer.std :: is_const :: type> :: value是正確的。 – 2014-11-21 03:37:56

相關問題