Код: Выделить всё
int foo(std::array const& v) {
auto const w = v;
int s{};
for (int i = 0; i < v.size(); ++i) {
s += (i % 2 == 0 ? v : w)[i];
}
return s;
}
int bar(std::array const& v) {
return std::accumulate(v.begin(),
v.end(),
0,
std::plus{});
}
clang может видеть, что и та же самая функция (Gr/> Clang может видеть, и Generies the Assembly для двух функций. Оптимизация).
Если я изменяю std :: array на std :: vector повсюду, однако два выхода сборки различаются; В частности, я вижу вызовы к новому +
Код: Выделить всё
memcpyI assume that difference in the assembly maps to foo and bar behaving differently exception-wise, in that the allocation caused by auto const w = v; could fail В foo , в то время как в баре .
нет распределения. " Если распределение на Auto const w = v; добивается успеха , то выполнение кода такое же, как если бы W было изменено на v , так что я мог бы также сделать это упрощение и даже предотвратить любое исключение" ? распределение ", < /p>
Код: Выделить всё
int foo(std::optional const& v, bool b) {
auto const w = v;
return (b ? v : w).value();
}
int bar(std::optional const& v) {
return v.value();
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... -parameter
Мобильная версия