【发布时间】:2021-10-20 22:46:38
【问题描述】:
以下 C++ 函数摘自第 151 - 157 行here:
template <typename... T>
std::string JoinPaths(T const&... paths) {
boost::filesystem::path result;
int unpack[]{0, (result = result / boost::filesystem::path(paths), 0)...};
static_cast<void>(unpack);
return result.string();
}
函数JoinPaths("foo", "bar", "doo.txt") 将返回一个std::string 值"foo/bar/doo.txt"(我认为)所以我理解函数的语义。
我试图理解return 语句之前的两行。 unpack 在 ints 的数组中,但是前面的 0 和末尾的省略号发生了什么(以及为什么)。有人可以解释这是如何扩展的吗?为什么是0?我假设static_cast 是为了防止编译器优化数组?
【问题讨论】:
-
扩展的哪一部分不明白?也许this question 解释一下?
-
@wcochran,不,只是为了抑制有关未使用变量(在这种情况下为数组)的警告。
-
顺便说一句,您可能还想阅读this。 tldr:您发布的代码是 C++17 之前的解决方法,因为该语言中缺少折叠表达式。
-
@wcochran 我起初误解了这个问题并删除了评论。是的,第二个
0只是在(something, 0)中丢弃something并让结果为int。第一个0是不要尝试创建一个大小为零的数组,以防万一调用没有参数的函数 -
发布 C++17 你可以折叠一个逗号运算符表达式对吗?即
(result = result / boost::filesystem::path(paths), ... )?