这种三重操作是否安全?

时间:2015-09-05 03:14:12

标签: c++ c++11 istream

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

1 个答案:

答案 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的答案也可能有用。