Благодаря Могу ли я реализовать max(A, max(B , max(C, D))) с использованием выражений свертки? Мне известен один рабочий подход к использованию std::min в выражении свертки (min2
ниже). Однако мне любопытно, почему приведенные ниже подходы min1
и min3
считаются неопределенным поведением (по-видимому, с учетом предупреждения)?
Насколько я понимаю, выражение должно оцениваться в обоих случаях слева направо, постоянно обновляя myMin
и присваивая последнее значение обратно myMin
. Кроме того, окончательный ответ также всегда верен как для gcc, так и для clang.
template <typename... Args>
auto min1(const Args&... anArgs) {
constexpr size_t N = sizeof...(anArgs);
auto myMin = std::get<0>(std::tuple(anArgs...));
myMin = std::get<N-1>(std::tuple((myMin = std::min(myMin, anArgs))...));
return myMin;
}
template <typename... Args>
auto min2(const Args&... anArgs) {
return std::min({anArgs...});
}
template <typename... Args>
auto min3(const Args&... anArgs) {
auto myMin = (anArgs, ...);
myMin = ((myMin = std::min(myMin, anArgs)), ...);
return myMin;
}
Предупреждения:
main.cpp: In instantiation of 'auto min1(const Args& ...) [with Args = {int, int, int}]':
main.cpp:26:30: required from here
main.cpp:8:45: warning: operation on 'myMin' may be undefined [-Wsequence-point]
8 | myMin = std::get<N-1>(std::tuple((myMin = std::min(myMin, anArgs))...));
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:8:45: warning: operation on 'myMin' may be undefined [-Wsequence-point]
main.cpp: In instantiation of 'auto min3(const Args& ...) [with Args = {int, int, int}]':
main.cpp:29:30: required from here
main.cpp:20:10: warning: left operand of comma operator has no effect [-Wunused-value]
20 | auto myMin = (anArgs, ...);
| ^~~~~
main.cpp:20:10: warning: left operand of comma operator has no effect [-Wunused-value]
main.cpp:21:11: warning: operation on 'myMin' may be undefined [-Wsequence-point]
21 | myMin = ((myMin = std::min(myMin, anArgs)), ...);
Наконец, причина, по которой я изучаю альтернативные подходы (в частности, min1), заключается в том, что я пытаюсь использовать стороннюю библиотеку, для которой оператор запятой устарел, и мне было интересно, можно ли это решить с помощью выражений сгиба.