2017-11-23 120 views
7

Miałem literówkę (|| zamiast |) i zauważyłem, że taki kod nie działa z GCC i kompiluje się z Visual. Wiem, że drugim parametrem std::ifstream jest int. Więc teoretycznie, bool musi zostać przekonwertowany w sposób niejawny na int. Dlaczego więc się nie udaje?Typo: błąd wywołany boolem na int w std :: ifstream pod Linuksem

Przykład wywoływania błędu (użyłem tylko niektórych ints zamiast flag).

#include <fstream> 

int main(int argc, char * argv[]) { 
    std::ifstream("foo", 2 | 3 || 4) 
} 

Odpowiedz

9

std::ifstream's constructor bierze jako drugi argument std::ios_base::openmode który jest typedef ed od implementacji zdefiniowane typ:

typedef /*implementation defined*/ openmode; 

Wydaje Wizualne używa liczb całkowitych, GCC nie ma, i to, dlaczego Twój kod nie działa na GCC.

+0

Thx za odpowiedź. Bez względu na przyczynę, wydaje mi się to trochę dziwne. Co może być przyczyną zdefiniowania typu standardowego parametru funkcji bibliotecznej. Czy nie może to spowodować problemu z przenośnością? – dgrat

+0

@ Gratulujemy, że należy tylko zdefiniować jawnie 'openmode'. – YSC

+0

Zastanawiam się trochę nad wszystkimi głosami na moje pytanie. Oczekiwano czegoś przeciwnego, ponieważ wydaje się, że jest to problem początkujący. – dgrat