【发布时间】:2017-06-27 14:19:52
【问题描述】:
我有一个函数:std::string format(const std::string sformat, ...);
它基本上就像一个花哨的 sprintf()。
由于我经常调用该函数,因此我想将格式字符串作为引用传递:const std::string& sformat。
不幸的是 va_start() 似乎无法在堆栈上找到变量参数列表的正确位置。
如果我删除“&”,它会正常工作。
两个问题:答:我是否需要引用以防止在调用期间复制sformat,或者优化器是否足够聪明,只需执行传递引用在后台?
B:我可以做些什么来防止格式字符串的值传递并且仍然不会混淆 va_start() ?
我的猜测是:指针传递。还是有更好的解决方案?
【问题讨论】:
-
"或者有更好的解决方案" 放弃可变参数包并开始使用可变参数模板怎么样?
-
这都是非常特定于编译器的,所以你能告诉我们你正在使用什么编译器吗?它的什么版本?你的目标是什么系统?
-
en.cppreference.com/w/cpp/utility/variadic/va_start :如果
parm_n声明为引用类型或与默认参数提升产生的类型不兼容的类型,则行为未定义。 -
你试过 boost 格式吗?
标签: c++ c++11 pass-by-reference