2012-06-05 26 views
5

Örnek:boost :: call_traits - Neden gcc bunun için yanlış mı veriyor?

#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 

} 

Soru:

Yanlış bir şey yapıyorum, sürece ben her ikisi için true almak gerektiğini düşünüyorum, ama gcc 4.7.0 çıkışları ikincisi için false. Kaybettiğim bir şey mi var?

cevap

8

Sınıf dışı bir türden bir değer hiçbir zaman bir kalifiye olmaz. Sadece sınıf-tipi r değerleri yapıya uygun olabilir.

Yani, fonksiyon f bir const int dönen olarak ilan olsa bile, ve fonksiyon f tipi const int() olsa, çağrı ifadesi f() türü (const olmayan) int bir rvalue olduğunu.

(. the new C++11 expression category taxonomy, çağrı sentezleme f() bir tip int arasında prvalue aynı kural geçerlidir: "sınıf olmayan prvalues ​​her ev-niteliksiz türleri" C++ 11 §3.10/4 bildiren)

İlgili konular