使用流进行三元操作安全吗?


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

我不能说你的版本到底有多安全。然而,就我个人而言,我不希望移动 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;
    // ...
}

这个SO问题的答案可能也很有趣。

最新更新