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
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
我不能說你的版本究竟有多安全。但是,我個人並不希望移動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的答案也可能是感興趣。
讓我們這樣說吧:如果你必須花時間思考這樣做是否安全,你可能不應該這樣做。 –