gpt4 book ai didi

c++ - 函数模板中的参数包是否可以跟随另一个取决于返回类型的参数?

转载 作者:行者123 更新时间:2023-12-04 11:59:45 32 4
gpt4 key购买 nike

我有一个函数,其中模板类型参数跟随一个参数包。它看起来像这样:

template<typename...Args, typename T>
T* default_factory_func()
{
return new T;
}
Visual C++ 编译器拒绝它并返回错误 C3547: template parameter 'T' cannot be used because it follows a template parameter pack and cannot be deduced from the function parameters of 'default_factory_func' .
但是,我尝试了 Compiler Explorer 上提供的各种版本的 GCC(从 4.4.7 开始)和 clang(从 3.1 开始),并且它们都可以很好地编译这些代码。
// this code is just a minimal example condensed
// from a much more complex codebase
template<typename T>
T* construct(T* (*factory_func)())
{
return factory_func();
}

template<typename...Args, typename T>
T* default_factory_func() // C3547 on this line
{
return new T(Args()...);
}

struct some_class {
some_class(int, int, int) {}
};

int main()
{
construct<some_class>(
default_factory_func<int,int,int>
);
}

这是 MSVC 的一些怪癖还是标准不允许?

最佳答案

我认为这里的标准很困惑(如果不存在,可能需要一个问题)。

  • default_factory_func的定义根据 [temp.param] 格式错误

  • A template parameter pack of a function template shall not be followed by another template parameter unless that template parameter can be deduced from the parameter-type-list ([dcl.fct]) of the function template or has a default argument


  • 同时,default_factory_func的类型可以(可以说)根据 [temp.deduct.funcaddr] 推导出来因为您正在尝试匹配 some_class*(*)(void) 的目标类型当您通过时&default_factory_func<int,int,int>

  • Template arguments can be deduced from the type specified when taking the address of an overload set. If there is a target, the function template's function type and the target type are used as the types of P and A, and the deduction is done as described in [temp.deduct.type]. Otherwise, deduction is performed with empty sets of types P and A


    (感谢 n.m. 在他们的 now-deleted-answer 中指出了第二个)
    我认为最安全的方法是通过重新排序模板参数来避免违反第一条规则:
    template<class T, typename...Args>
    T* default_factory_func()
    {
    return new T(Args()...);
    }
    然后显式转换您的函数指针以解决重载:
    auto foo = construct(
    static_cast<some_class*(*)()>(default_factory_func<some_class, int, int, int>)
    );
    Live Code
    (最新在 gcc/clang/和 msvc 上编译)

    关于c++ - 函数模板中的参数包是否可以跟随另一个取决于返回类型的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69092639/

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