2012-06-05 9 views
5

उदाहरण:बढ़ावा :: call_traits - जीसीसी इस के लिए झूठा क्यों दे रहा है?

#include <iostream> 
#include <boost/call_traits.hpp> 
#include <type_traits> 

boost::call_traits<int>::param_type f() 
{ 
     return 1; 
} 

int main() 
{ 
     std::cout << std::boolalpha; 
     std::cout << 
     std::is_const<boost::call_traits<int>::param_type>::value 
     << std::endl; // true 
     std::cout << std::is_const<decltype(f())>::value << std::endl; // false 

} 

प्रश्न:

जब तक, मैंने कुछ गलत कर रहा हूँ, मुझे लगता है कि मैं दोनों के लिए true हो रही किया जाना चाहिए, लेकिन जीसीसी 4.7.0 आउटपुट बाद के लिए false। क्या मैं कुछ छोड़ रहा हूं?

उत्तर

8

एक गैर-वर्ग प्रकार का रावल कभी भी योग्यता प्राप्त नहीं होता है। केवल वर्ग-प्रकार के रावल ही कॉन्स्टेबल हो सकते हैं।

तो, भले ही समारोह f एक const int लौटने के रूप में घोषित किया जाता है, और भले ही समारोह f के प्रकार const int() है, कॉल अभिव्यक्ति f() प्रकार (गैर स्थिरांक) int के एक rvalue है।

(the new C++11 expression category taxonomy में, कॉल अभिव्यक्ति f() एक प्रकार int की prvalue है यही नियम लागू होता है:। "। गैर वर्ग prvalues ​​हमेशा सीवी-अयोग्य प्रकार है" 11 सी ++ §3.10/4 कहा गया है कि)

संबंधित मुद्दे