gpt4 book ai didi

c++ - 具有 'const' 参数重载的可变参数模板

转载 作者:IT老高 更新时间:2023-10-28 22:25:54 25 4
gpt4 key购买 nike

简化的示例代码:

#include <iostream>

template<typename T>
void func(T &x)
{
std::cout << "non-const " << x << std::endl;
}

template<typename T>
void func(const T &x)
{
std::cout << "const " << x << std::endl;
}

template<typename ...ARGS>
void proxy(ARGS ...args)
{
func(args...);
}

int main()
{
int i = 3;

func(i);
func(5);
func("blah");

proxy(i);
proxy(5);
proxy("blah");
}

预期输出:

non-const 3
const 5
const blah
non-const 3
const 5
const blah

实际输出:

non-const 3
const 5
const blah
non-const 3
non-const 5
non-const blah

因此,当通过可变参数模板时,函数参数的 const 限定符会以某种方式丢失。为什么?我怎样才能防止这种情况发生?

PS:使用 GCC 4.5.1 和 SUSE 测试11.4

最佳答案

您只是偶然发现了 forwarding problem .使用 perfect forwarding 解决此问题.

基本上,您需要通过右值引用获取参数,并依赖 std::forward在保持其性质的同时正确转发它们:

template<typename ...Args>
void proxy(Args&& ...args)
{
func(std::forward<Args>(args)...);
}

关于c++ - 具有 'const' 参数重载的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10246094/

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