c ++ 11 вызывает преобразование типа при перемещении объекта - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть простой код, я скомпилировал код на GCC 5, 6 и 8 и развернул его на физическом тестовом стенде, который по какой-то причине использует gcc 4.8.3, код не может скомпилироваться на тестовом стенде (ubuntu 14.04)Я почесал голову, чтобы понять, в чем проблема, но пока ничего.Я скопировал приведенный ниже код:

#include <memory>
#include <utility>

struct probe_payload
{
    int id{0};
    int sub_id{0};
    int snd_ts{0};
    int rcv_ts{0};
    int rtt_ms{1000};
    double snd_bw_bps{0};
    bool end_flag{false};
};

struct probe_message
{
  public:
    using buffer_t = void const *;

    probe_payload info;
    char shim[1280];

};

template<typename Packet>
struct parcel
{
    explicit parcel(Packet&& object, int ts) : item{std::move(object)}
    {
        arrival_time = std::move(ts);
    }

    parcel() = delete;
    parcel(const parcel<Packet>& /* other */) = default;
    parcel<Packet>& operator=(const parcel<Packet>& /* other */) = default;
    parcel(parcel<Packet>&& /* other */) = default;
    parcel<Packet>& operator=(parcel<Packet>&& /* other */) = default;

    Packet item;
    int arrival_time{0};
};


template <typename T>
parcel<T> get_parcel()
{
    T a;
    return parcel<T>{std::move(a), 10};
}


int main()
{
    auto p = get_parcel<probe_message>();
    return p.arrival_time;
}

: в экземпляре 'parcel :: parcel (Packet &&, int) [with Packet = probe_message]':

: 48: 38: требуется от 'parcel get_parcel () [с T = probe_message]'

: 54: 40: требуется отсюда

: 28: 67: ошибка: не удалось преобразовать 'std :: move((* & object)) 'из' std :: remove_reference :: type {aka probe_message} 'в' probe_payload '

явная посылка (Packet && object, int ts): item {std :: move (object)}

Я прикрепил ссылку из проводника компилятора .

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Суть проблемы может быть уменьшена до:

#include <utility>

struct probe_message
{
    int id;
};

int main()
{
    probe_message a;
    probe_message b{std::move(a)};
}

, которая отклоняется gcc 4.9.4, принимается gcc 5+ и исправляется заменой { } на ( ).

Я полагаю, что это та же проблема, что и в Приоритет инициализации списка для объекта того же типа , адресуемого DR 1467.

gcc 4 объединяет инициализацию со списком, ине может конвертировать std::move(a) в int.В более поздних версиях копирование или построение перемещения выполняются из списка одного элемента того же типа.

Отчет о дефектах не был разрешен до тех пор, пока после публикации C ++ 14, кажется, слишком поздно для gcc 4.

0 голосов
/ 13 декабря 2018

Похоже, что эта версия GCC не любит инициализацию скобок item{std::move(object)}.Он компилируется с item(std::move(object)), хотя.

живой пример

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