2010-11-30 3 views
1

У меня возникла странная проблема.Почему этот простейший код C++ 0x недействителен?

Исходный код является простым и самоочевидным следующим образом:

#include <vector> 
#include <iostream> 
#include <functional> 

using namespace std; 
using namespace std::tr1; 

template<class T_> 
void show_size(T_ coll) 
{ 
    cout << coll.size(); 
} 

int main() 
{ 
    vector<int> coll; 
    coll.push_back(1); 

    show_size(ref(coll)); 

    return 0; 
} 

ВК ++ 2010 отчеты:

ошибка C2039: 'размер': не является членом «станд :: tr1 :: reference_wrapper < _Ty>»

Как мы знаем, reference_wrapper может автоматически преобразовать себя в его базовый тип, вот vector<int>. Почему такой простой код недействителен?

+0

Это почти такой же вопрос, как http://stackoverflow.com/questions/4311622/why-does-ref- в-c0x-не-себя-как-ожидалось. Опять же, неявные преобразования не происходят при доступе к члену. Мое предложение было бы такой же свободной функцией `get`, как в другом потоке:` get (coll) .size(); `. – UncleBens 2010-11-30 17:27:41

+0

@UncleBens: Большое спасибо за вашу помощь. Мне просто интересно, почему поведение ref() настолько противоречиво. Если моя функция шаблона должна явно использовать get(), то функция будет менее общей. Для меня это «плохой запах» в коде – xmllmx 2010-11-30 18:04:08

ответ

1

Нет это не может в этом вся точка отсчета обертки, так как он не распадается из ссылки, если явно не запрошены с использованием .get()

Edit: не перепутать форсирует не ссылается на оболочку с стандартный, у boost фактически есть неявное преобразование (но целевая функциональность немного отличается)

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