Интегральное продвижение и оператор + = - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужно устранить предупреждения gcc -Wconversion.Например,

typedef unsigned short     uint16_t;

uint16_t a = 1;
uint16_t b = 2;
b += a;

дает

warning: conversion to 'uint16_t {aka short unsigned int}' from 'int' may alter its value [-Wconversion]
     b += a;
     ~~^~~~

. Я могу устранить это с помощью

uint16_t a = 1;
uint16_t b = 2;
b = static_cast<uint16_t>(b + a);

Есть ли способ сохранить operator+= и устранить предупреждение?Спасибо.

РЕДАКТИРОВАТЬ

Я использую

gcc test.cpp -Wconversion

my gccверсия

gcc.exe (Rev3, построена из проекта MSYS2) 7.2.0

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Вы можете создать свою собственную абстракцию для перегрузки оператора +=, что-то вроде

template <typename T>
class myVar {
    public:
    myVar(T var) : val{var} {}
    myVar& operator+=(const myVar& t) { 
        this->val = static_cast<T>(this->val + t.val);
        return *this; 
    }
    T val;
};

int main()
{
    typedef unsigned short     uint16_t;

    myVar<uint16_t> c{3};
    myVar<uint16_t> d{4};
    c += d;
}

. Он по-прежнему использует static_cast, но вам нужно использовать его только один раз, а затем повторно использовать.И вам это не нужно в ваших main.

ИМХО, это просто добавляет накладные расходы, но мнения могут отличаться ...

0 голосов
/ 07 февраля 2019

Мне нужно исключить предупреждения gcc -Wconversion.

Вы не говорите почему, но на самом деле это маловероятно.

Из вики-страницы GCCна этом переключателе :

Почему Wconversion не поддерживается -Wall или хотя бы -Wextra?

Неявные преобразования очень распространены вC. Это связано с тем, что во внешних интерфейсах отсутствует поток данных (см. Следующий вопрос), что приводит к тому, что трудно избежать предупреждений о идеально работающем и корректном коде.Wconversion предназначен для ниши использования (аудит безопасности, перенос 32-битного кода на 64-битный и т. Д.), Где программист готов принимать и обходить недопустимые предупреждения.Поэтому его не следует включать, если он явно не запрашивается.

Если вы не хотите этого, просто отключите его.

Использование кода с ненужными приведениями,затруднить чтение и поддержку - неправильное решение.

Если ваши инженеры-строители настаивают на этом флаге, спросите их почему и попросите их остановиться.

...