gpt4 book ai didi

c++ - 我可以有 const 参数包吗?

转载 作者:行者123 更新时间:2023-11-30 01:35:21 24 4
gpt4 key购买 nike

好吧

为了好玩而开发一个简单的日志系统,遇到了一个有趣的问题。我认为能够按照以下方式写一些东西会很好:

Log(Info, "Result: {}", value);

给我这样的结果

结果:45

(这里使用 fmt 的格式化样式。)

所以我这样设置函数:

template <typename ...args_t>
void Log(LogLevel Level, const char* Message, args_t&&... Args)

效果很好,没有问题。但是,我的心态是,如果函数未修改参数,则应将其标记为 const(用于优化和给程序员的注释),所以我尝试了这个:

template <typename ...args_t>
void Log(const LogLevel Level, const char* Message, const args_t&&... Args)

这一直给我错误,VS2017 给了我

错误 C2665:“日志”:4 个重载中没有一个可以转换所有参数类型

我只是做错了吗?我不应该担心参数包的常量性吗?有一个更好的方法吗?有时我很难理解这个参数打包业务。

(我花了大约 3 个小时来调查这个问题,但找不到任何关于堆栈溢出或整个互联网的相关信息,如果这个问题已经在其他地方得到解答,请原谅我。)

最佳答案

当您真正想要的是常量引用时,您正在使用转发引用。

args_t&& 替换为 const args_t&

转发引用使用与右值引用相同的语法声明,带有双 &(所以 &&)。一个与另一个的区别在于它是否出现在推导的上下文中:转发引用被推导,右值引用不是。换句话说,如果编译器使用您的函数参数来确定模板参数是什么(例如您的情况),那么它就是转发引用。否则,它是一个右值引用。

在您的情况下,const 引用更可取,因为您明确打算不修改参数。由于您永远不想通过非 const 引用接受参数,因此您不需要完美的转发,使用 const 引用也会让您获得编译器检查的不变性作为接受纯右值(例如文字等)的能力。

关于c++ - 我可以有 const 参数包吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54282722/

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