Poniższy kod:Jak użyć wyraźnego rzutowania, aby ukryć to ostrzeżenie?
#include <cstdint>
#include <vector>
#include <boost/range/irange.hpp>
int main() {
int64_t first = 0, last = 10;
std::vector<double> result = boost::copy_range<std::vector<double>>(boost::irange(first, last));
}
generuje ostrzeżenie (i ponad 100 wierszy matrycy śladu stosu wywołań):
1>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0(600):
warning C4244: 'initializing' : conversion from 'unsigned __int64' to 'double', possible loss of data
Chcę poinformować kompilator, że nie obchodzi, że moja int64_t
są konwertowane na double
. Ja też nie chcę używać 32-bitowej int. Zwykle używam static_cast<double>(my64BitInt)
do rozwiązania tego problemu, ale to nie zadziała dla zakresu. W tej chwili używam kompilator pragmy, aby wyłączyć ostrzeżenie, ale to nie jest idealne.
Edytuj: Oto pastebin z pełnym wyjściem kompilatora.
1) Można wyłączyć ostrzeżenia w ustawieniach projektu zamiast z pragma, jeśli uważasz, że nigdy nie dba o to. 2) Dlaczego 'first' i' last' są zadeklarowane jako 'int64_t' zamiast' double'? – celticminstrel
@celticminstrel pragmas w Visual Studio pozwala ci na zignorowanie ostrzeżenia na poszczególnych liniach kodu i pozostawienie ich na miejscu dla reszty projektu. – IronMensan
Jestem świadomy. (Możesz to zrobić również za pomocą clang/gcc, choć składnia jest trochę inna.) Po prostu wskazywałem to częściowo, ponieważ osobiście uważam, że to ostrzeżenie jest bezużyteczne częściej niż użyteczne i częściowo na wypadek, gdybyś się zgodził. – celticminstrel