Почему ref в C ++ 0x не работает должным образом? - PullRequest
0 голосов
/ 30 ноября 2010

Мне очень жаль за мою предыдущую ошибку. Поэтому я перефразировал этот вопрос следующим образом:

Самый простой код C ++ 0x ниже должен быть недействительным:

#include <functional>

template<class T_>
void f(T_ obj) 
{
    Obj++; // OK that is as expected.
    static_cast<int&>(obj) = 2; // Though ugly, this is still OK.

    obj = 2; // However, this line will generate a compiler error
}

int main()
{
    int i = 1;
    f(std::tr1::ref(i));
}

Кто может сказать мне точную семантику ref?

1 Ответ

1 голос
/ 30 ноября 2010

Причина ошибки в том, что нет подходящего оператора присваивания, который можно было бы применить.Единственный кандидат:

reference_wrapper& operator=(const reference_wrapper<T>& x);

A reference_wrapper действует как ссылка с помощью операторов неявного преобразования:

operator T& () const;

Однако неявное преобразование не произойдет налевая сторона оператора присваивания.

Если вы ожидаете, что этот шаблон будет поддерживать reference_wrapper, возможно, вы можете обойти это так:

#include <functional>
#include <iostream>

template <class T>
T& get(T& value)
{
    return value;
}

template <class T>
T& get(std::reference_wrapper<T>& w)
{
    return w.get();
}


template<class T_>
void f(T_ obj)
{
    //obj = 2;
    get(obj) = 2;
}

int main()
{
    int i = 1;
    f(std::ref(i));
    std::cout << i << '\n';
    f(3.14); //at the same time, we want this also to work
}

Почему reference_wrapperне имеет оператора присваивания для сохраненного типа, не уверен.Версия Boost также не имеет, и они просто говорят, что этот класс «обычно позволяет шаблонам функций работать с неизмененными ссылками».Думаю, это не тот случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...