2015-09-05 37 views
1
decltype(std::cin)&& is = (argc < 2 ? std::move(std::cin) : std::ifstream(argv[1])); 

這樣很危險嗎?有沒有更簡單/更危險的方式?這是三元操作與istreams安全嗎?

它工作正常。例如:

int i = 42; 
is >> i; // enter 50 
std::cout << i; // 50 
+3

讓我們這樣說吧:如果你必須花時間思考這樣做是否安全,你可能不應該這樣做。 –

回答

2

我不能說你的版本究竟有多安全。但是,我個人並不希望移動std::cin或綁定到std::ifstream,除非我知道它是開放的(能夠)。我傾向於首先打開std::ifstream(如果它已在argv中指定),然後綁定到std::istream&,如果is_open()還綁定到std::cin

我做所有的時間,這是完全安全的:

int main(int argc, char* argv[]) 
{ 
    std::ifstream ifs; 

    if(argc > 1) 
    { 
     ifs.open(argv[1]); 
     // check error and maybe exit 
    } 

    std::istream& is = ifs.is_open() ? ifs : std::cin; 

    // ... 
} 

this SO question的答案也可能是感興趣。