std::apply 应该只适用于 std::tuple 吗?
Should std::apply only apply to std::tuple?
std::apply
的函数签名没有将模板参数Tuple
限制为std::tuple
的特化,所以它仍然可以接受一个类元组定义 std::tuple_size_v
(godbolt) 的对象:
#include <tuple>
#include <utility>
#include <array>
int main() {
std::apply([](int, int) {}, std::array{0, 0});
std::apply([](int, int) {}, std::pair {0, 0});
std::apply([](int, int) {}, std::tuple{0, 0});
}
但是[tuple.apply]中std::apply
的描述是:
20.5.5 Calling a function with a tuple
of arguments
这是否意味着将 std::apply
应用于 std::tuple
以外的对象是未定义的行为?
20.5.5 Calling a function with a tuple
of arguments
我非常怀疑章节标题是否规范。
实际函数描述为 being equivalent to the reference implementation,它使用 get
和 tuple_size_v
检查“元组”参数。
Cppreference concurs.
std::apply
的函数签名没有将模板参数Tuple
限制为std::tuple
的特化,所以它仍然可以接受一个类元组定义 std::tuple_size_v
(godbolt) 的对象:
#include <tuple>
#include <utility>
#include <array>
int main() {
std::apply([](int, int) {}, std::array{0, 0});
std::apply([](int, int) {}, std::pair {0, 0});
std::apply([](int, int) {}, std::tuple{0, 0});
}
但是[tuple.apply]中std::apply
的描述是:
20.5.5 Calling a function with a
tuple
of arguments
这是否意味着将 std::apply
应用于 std::tuple
以外的对象是未定义的行为?
20.5.5 Calling a function with a
tuple
of arguments
我非常怀疑章节标题是否规范。
实际函数描述为 being equivalent to the reference implementation,它使用 get
和 tuple_size_v
检查“元组”参数。
Cppreference concurs.