依靠短路评估是否安全?

时间:2017-06-14 21:21:59

标签: c++ c++14 evaluation short-circuiting

我喜欢short-circuit evaluation如何工作的想法,它可以在代码中保存许多不必要的行。但我不确定我能放多少信心,因为它适用于所有编译器。

考虑以下代码段:

#include <iostream>
#include <string>
#include <cctype>

int main() {
    std::string foo { "this is a test" };
    auto pos = foo.find_first_not_of("abcdefghijklmnopqrstuvwxyz ");

    if(pos != std::string::npos && ispunct(foo.at(pos)))
        std::cout << "The first non-alphabetic character is a punctuation.";
    else
        std::cout << "The string contains only alphabetic characters.";

    return (std::cout << std::endl, 0);
}

根据短路评估的条款,ispunct(foo.at(pos))将不会被评估,程序将不会尝试访问超出界限的元素。除了我的GCC 5.4.0编译器之外,这种方法是否完全安全?

此外,如何在ifwhile声明之外使用短路评估?假设我想在以下示例中允许具有适当安全性的空指针:

#include <iostream>
#include <string>
#include <vector>

template<typename... Strings>
std::vector<std::string> pack(Strings... strs) {
    using dummy = int[];
    std::vector<std::string> out;

    (void)dummy { 0, ((void)(strs && (out.push_back({ strs }), false)), 0)... };
    return out;
}

int main() {
    const auto result = pack("foo", nullptr, nullptr, "bar", nullptr, "baz");

    for(const auto& e : result)
        std::cout << e << ' ';

    return (std::cout << std::endl, 0);
}

只有当(strs && (out.push_back({ strs }), false))不是strs时,out才会将当前nullptr置于too_long: "Maximum %{count} characters. You currently have %{value.length} characters." 向量中。我使用GCC 5.4.0检查了上面代码的assembly output,并且零优化级别跳转指令阻止了从空指针构造字符串。但问题仍然存在:依靠短路评估是否安全?

0 个答案:

没有答案