gpt4 book ai didi

c++ - 当涉及参数包时,我可以依赖具有默认值的参数类型被推断为空包这一事实吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:15:48 24 4
gpt4 key购买 nike

考虑一个例子:

#include <iostream>
#include <tuple>
#include <utility>

template <class... Ts, size_t... Is>
void foo(std::tuple<Ts...> t,
std::index_sequence<Is...> = {}) {
if (sizeof...(Ts) != sizeof...(Is)) {
foo(t, std::make_index_sequence<sizeof...(Ts)>{});
return;
}
(std::cout << ... << std::get<Is>(t));
}

int main() {
foo(std::make_tuple(1, 2, 3));
}

我假定函数的第二个参数的类型 foo默认情况下将推导为 std::integral_sequence<std::size_t>因此我不必创建辅助函数来使用 Is...元组元素的索引,但可以调用 foo第二个参数设置为 std::make_index_sequence<sizeof...(Ts)>{} .

当涉及参数包时,我是否可以依赖具有默认值的参数类型被推断为空包这一事实,或者它是否会导致未定义的行为?

以上代码使用g++-6编译和 clang++-3.6使用 -std=c++1z选项按预期工作。

最佳答案

是的。你依赖于,来自 [temp.arg.explicit]:

A trailing template parameter pack (14.5.3) not otherwise deduced will be deduced to an empty sequence of template arguments.

什么构成“尾随模板参数包”实际上从来没有完全正确定义,但所有编译器在这里解释 Is...


也就是说,我不会依赖它,不是因为它不正确,而是因为它使代码难以理解。特别是因为在这种情况下,有一种简单的方法可以提取 lambda 的所有元素:std::apply():

template <class... Ts>
void foo(std::tuple<Ts...> t) {
std::apply([](auto&... args) {
(std::cout << ... << args);
}, t);
}

关于c++ - 当涉及参数包时,我可以依赖具有默认值的参数类型被推断为空包这一事实吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38158702/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com