decltype(std::cin)&& is = (argc < 2 ? std::move(std::cin) : std::ifstream(argv[1]));
这是危险的吗?是否有更简单/更危险的方式?
工作正常。例如:
int i = 42;
is >> i; // enter 50
std::cout << i; // 50
答案 0 :(得分:2)
我无法准确地说出你的版本有多安全。但是,就个人而言,我不想移动 std::cin
或绑定到std::ifstream
,除非我知道它是开放的(能够)。我赞成首先打开std::ifstream
(如果已在argv
中指定),然后在std::istream&
绑定到is_open()
时绑定到std::cin
。< / p>
我一直这个并且非常安全:
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的答案也可能有用。