gpt4 book ai didi

c++ - 推导指南和带有可变模板构造函数的可变类模板 - 不匹配的参数包长度

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

考虑以下 class 定义和 deduction guide :

template <typename... Ts>
struct foo : Ts...
{
template <typename... Us>
foo(Us&&... us) : Ts{us}... { }
};

template <typename... Us>
foo(Us&&... us) -> foo<Us...>;

如果我尝试使用显式模板参数实例化foo,代码会正确编译:

foo<bar> a{bar{}}; // ok

如果我尝试通过演绎指南实例化foo...

foo b{bar{}};
  • g++7 产生编译错误:

    prog.cc: In instantiation of 'foo<Ts>::foo(Us ...) [with Us = {bar}; Ts = {}]':
    prog.cc:15:16: required from here
    prog.cc:5:27: error: mismatched argument pack lengths while expanding 'Ts'
    foo(Us... us) : Ts{us}... { }
    ^~~
  • clang++5 爆炸了:

    #0 0x0000000001944af4 PrintStackTraceSignalHandler(void*) (/opt/wandbox/clang-head/bin/clang-5.0+0x1944af4)
    #1 0x0000000001944dc6 SignalHandler(int) (/opt/wandbox/clang-head/bin/clang-5.0+0x1944dc6)
    #2 0x00007fafb639a390 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x11390)
    #3 0x0000000003015b30 clang::Decl::setDeclContext(clang::DeclContext*) (/opt/wandbox/clang-head/bin/clang-5.0+0x3015b30)
    ...
    clang-5.0: error: unable to execute command: Segmentation fault

live example on wandbox

虽然 clang++ 肯定有问题 (报告为问题 #32673 ),但 g++ 拒绝我的代码是否正确? 我的代码格式不正确吗?

最佳答案

为了进一步简化您的示例,GCC 似乎没有在演绎指南中实现可变模板参数:

https://wandbox.org/permlink/4YsacnW9wYcoceDH

我在标准或 cppreference.com 上的演绎指南措辞中没有看到任何明确提及可变参数模板。我看不到任何不允许这样做的标准解释。因此我认为这是一个错误。

关于c++ - 推导指南和带有可变模板构造函数的可变类模板 - 不匹配的参数包长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53356903/

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