2015-01-30 2 views
4

Не могли бы вы объяснить, почему это печатает 1? Не должно BOOST_TYPEOF возвращение const int. Как можно проверить, возвращает ли функция const без использования возможностей C++ 11?BOOST_TYPEOF возвращает int вместо const int

#include <iostream> 

#include <boost/typeof/typeof.hpp> 
#include <boost/type_traits/is_same.hpp> 

const int f_const_int() {return 1;} 

int main() 
{ 
    typedef BOOST_TYPEOF(f_const_int()) type; 
    std::cout << (boost::is_same<type, int>::value) << std::endl; 
} 

ответ

4

Если prvalue выражение имеет тип CVint, что резюме-классификатор игнорируется. [Выражение]/6:

Если prvalue изначально имеет тип «резюмеT», где T является резюме-неквалифицированных внеклассового, типа не-массив, типа выражения является до любого последующего анализа до T.

Таким образом, макрос не получает информацию о том, что тип возврата был const.
Возможные обходной путь:

#include <boost/type_traits/function_traits.hpp> 

// […] 
typedef boost::function_traits<BOOST_TYPEOF(f_const_int)>::result_type type; 

Demo.

+0

Какова причина отказа от квалификации * cv * здесь? – Barry

+0

@Barry Возможно, потому, что cv-квалификаторы prvalues ​​несущественны. Но если нам не нужно иметь дело с ними, то определение информации в [expr] облегчается. – Columbo

+0

Данные, передаваемые 'BOOST_TYPEOF', являются rvalue. Он неназванный, поэтому const или нет, у вас нет возможности изменить его, не присваивая ему значение lvalue, которое должно быть объявлено как const для присвоения, чтобы не жаловаться. – iwolf

Смежные вопросы