gpt4 book ai didi

c++ - 使用参数包和通用引用进行过载选择

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:09 24 4
gpt4 key购买 nike

我一直在尝试将完美转发与我递归解压的参数包一起使用,这让我意识到我并不真正理解在存在通用引用的情况下管理如何选择给定函数的重载的规则.

我的困惑是由一些类似于以下的代码引起的:

#include <iostream>
template<class T>
void write(const T& data)
{
std::cout << "Called write(const T& data)" << std::endl;
}

template<class T, class ...U>
void write(T&& obj, U&&... objs)
{
std::cout << "Called write(T&& obj, U&&... objs)" << std::endl;
}

int main(int, char**)
{
int j = 0;
write(j);
return 0;
}

运行时,选择了 void write(T&& obj, U&&... objs) 重载,但是如果我更改了 void write(const T& data) 的签名> 到 void write(const T data)void write(T& data)void write(T data) 然后调用该函数.

为什么未选择void write(const T& data)重载但void write(const T data), void write(T& data), 或者 void write(T data) 是?

编辑:我最初认为这个问题可能与 std::forward 的使用有关;然而,它似乎更多是通用引用的结果。我的原始示例如下:

#include <iostream>

void write()
{
std::cout << "Writing nothing" << std::endl;
}

void write(const char* data)
{
std::cout << "Writing const char*: " << data << std::endl;
}

template<class T>
void write(const T& data)
{
std::cout << "Writing generic: " << data << std::endl;
}

template<class T, class ...U>
void write(T&& obj, U&&... objs)
{
write(std::forward<T>(obj));
write(std::forward<U>(objs)... );
}

int main(int, char**)
{
int j = 0;
write("a", j);
return 0;
}

最佳答案

这个问题的答案可能有点复杂。我会尽量简单一些。

看来,在引用折叠之后,重载决议的候选者是 write(const T&)write(T&),两者都具有 T = int 而第二个有 U... = (none)。这样,后一个被选中并再次调用转发函数。

关于c++ - 使用参数包和通用引用进行过载选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52397309/

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