gpt4 book ai didi

c++ - 参数包后具有非推导类型的参数

转载 作者:行者123 更新时间:2023-12-04 14:01:19 24 4
gpt4 key购买 nike

下一个程序在 clang++ 和 g++ 中有不同的行为:

#include <type_traits>
#include <utility>

template< std::size_t index, typename type >
struct ref { type & value; };

template< std::size_t index, typename type >
type && get(ref< index, type > const & r)
{
return std::forward< type >(r.value);
}

template< typename F, typename ...types, std::size_t ...indices >
decltype(auto) apply_inverse(F & f, types &... values, std::index_sequence< indices... >)
{
struct : ref< indices, types >... {} refs{{values}...};
constexpr std::size_t top = sizeof...(indices) - 1;
return std::forward< F >(f)(get< top - indices >(refs)...);
}

template< typename F, typename ...types >
decltype(auto) apply_inverse(F && f, types &&... values)
{
return apply_inverse< F, types... >(f, values..., std::index_sequence_for< types... >{});
}

#include <iostream>

int main()
{
auto const print = [] (auto const &... value) -> std::ostream & { return (std::cout << ... << value); };
apply_inverse(print, 1, 2, 3) << std::endl;
}

Live example .

它只是尝试恢复传递的参数并对它们应用一些函数。

对于 G++,它编译得很好,但对于 clang++(甚至来自主干),它会出现以下错误:

error: no matching function for call to 'apply_inverse'



我认为原因在于,在上重载中,函数原型(prototype)中的参数包后有一个参数。但是参数包中所有参数的类型都是明确指定的。

编译器接受代码是否正确?

最佳答案

没有具体说明是哪个版本的 Clang 拒绝了上面的代码。
但此时 Clang 12 接受了它,以及 GCC 和 MSVC:
https://gcc.godbolt.org/z/qMc9fKTEf
所以代码是完全合法的。

关于c++ - 参数包后具有非推导类型的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41262641/

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