gpt4 book ai didi

c++ - 转发模板优先于过载

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:26 26 4
gpt4 key购买 nike

我认为如果参数也匹配的话,非模板总是优先于模板。

但是:

template <typename... Args>
void Trace(Args&&... args)
{
throw "what the frak";
}

void Trace(const int&)
{}

int main()
{
Trace(42);
}

This throws除非我制作非模板 Trace(int)Trace(int&&),即不使用 const ref.

这有点烦人,因为我想为特定参数类型提供不同的实现,而模板的实际实现没有意义(事实上,不会编译)。

我可以通过使第二个函数成为特化来修复它,但前提是我通过采用右值引用来匹配参数类型:

template <>
void Trace(int&&)
{}

而且,好吧,也许我不想那样做!也许我有时想用 const 来调用它,而不希望两次特化。

在本例中,以这种方式简单地提供非模板重载是否正确且符合标准?这是我第一次注意到这种行为(并不一定意味着什么!)。

最佳答案

42int 类型的右值,因此它更紧密地绑定(bind)到 int&& 而不是 const int& .这就是它调用模板 Trace 函数的原因。

如果你打电话

const int i{};
Trace(i);

然后将调用您的 Trace(const int&) 重载。


可能的解决方法:

  • 添加调用 Trace(const int&)Trace(int&&) 重载。您可能还需要一个 Trace(int&);

  • 在模板化 Trace 上使用 SFINAE 以防止在第一个参数是 int 时实例化;

    template <typename Arg, typename... Args>
    auto Trace(Arg&& arg, Args&&... args)
    -> std::enable_if_t<!std::is_same_v<std::decay_t<Arg>, int>>
    {
    throw "what the frak";
    }
  • 将模板化的 Trace 改为采用 const Args&...

关于c++ - 转发模板优先于过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57888165/

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