gpt4 book ai didi

c++ - 多包参数包匹配规则

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

我正在尝试使用参数包和一些标准匹配规则编写一个接受另一个函数的函数。例如:

template <typename... TListElems, typename... TVectorElems>
void goal(void (*fn)(std::list<TListElems>..., std::vector<TVectorElems>...));

为了消除歧义TListElemsTVectorElems , 我加了一些 std::tuple<T...>*所以调用者可以是显式的:

template <typename... TListElems, typename... TVectorElems>
void foo(std::tuple<TListElems...>*,
std::tuple<TVectorElems...>*,
void (*)(std::list<TListElems>..., std::vector<TVectorElems>...))
{
// blah blah blah
}

void bar(std::list<int>, std::list<unsigned>, std::vector<float>, std::vector<double>)
{
// blah blah blah
}

int main()
{
foo((std::tuple<int, unsigned>*) nullptr,
(std::tuple<float, double>*) nullptr,
&bar);
}

Clang 以我期望的方式愉快地编译它,而 g++ (7.2.1) 给出了编译错误:

matching.cpp: In function ‘int main()’:
matching.cpp:20:13: error: no matching function for call to ‘foo(std::tuple<int, unsigned int>*, std::tuple<float, double>*, void (*)(std::list<int>, std::list<unsigned int>, std::vector<float>, std::vector<double>))’
&bar);
^
matching.cpp:6:6: note: candidate: template<class ... TListElems, class ... TVectorElems> void foo(std::tuple<_Tps ...>*, std::tuple<_Elements ...>*, void (*)(std::list<TListElems>..., std::vector<TVectorElems>...))
void foo(std::tuple<TListElems...>*,
^~~
matching.cpp:6:6: note: template argument deduction/substitution failed:
matching.cpp:20:13: note: mismatched types ‘std::vector<TVectorElems>’ and ‘std::list<int>’
&bar);
^

main ,我会期待调用foo推断TListElems作为<int, unsigned>TVectorElems作为<float, double> , 领先 fn类型为 void (*)(std::list<int>, std::list<unsigned>, std::vector<float>, std::vector<double>) (只有一个包或我手动编写重载时的操作方式)。

§14.8.2.5/10 是标准中最接近于明确阻止 foo 的标准工作示例:

[Note: A function parameter pack can only occur at the end of a parameter-declaration-list (8.3.5). -end note]

std::list<TListElems>...一点 fn似乎会违反此说明,但这并不完全清楚。

问题是:谁是对的? GCC、Clang 还是其他?

最佳答案

我认为 clang 就在这里。

void (*)(std::list<TListElems>..., std::vector<TVectorElems>...) , TListElems...a non-deduced context ,这使得 TVectorElems...还有a non-deduced context .但是这两个参数包都是可以从两个元组指针参数中推导出来的,并且它应该能够只是use that deduction result。这里也是。

我提交了 gcc bug 83542 .

关于c++ - 多包参数包匹配规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47933345/

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