我喜欢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编译器之外,这种方法是否完全安全?
此外,如何在if
或while
声明之外使用短路评估?假设我想在以下示例中允许具有适当安全性的空指针:
#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,并且零优化级别跳转指令阻止了从空指针构造字符串。但问题仍然存在:依靠短路评估是否安全?