【发布时间】:2021-05-22 23:43:01
【问题描述】:
感谢Can I implement max(A, max(B, max(C, D))) using fold expressions?,我知道在折叠表达式中使用 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)的原因是因为我正在尝试使用不推荐使用逗号运算符的 3rd 方库,我想知道是否仍然可以使用折叠表达式来解决这个问题.
【问题讨论】:
标签: c++ c++17 fold-expression