【发布时间】:2021-03-29 04:41:36
【问题描述】:
由于 C++14 不能使用折叠表达式,为了使函数在每个可变参数上调用 bar,必须使用函数重载。
template<typename Arg>
void foo(Arg arg) {
bar(arg);
}
template<typename Arg, typename ...Args>
void foo(Arg arg, Args... args) {
bar(arg);
foo(args...);
}
但是使用逗号运算符和括号中的括号,可以在不重载的情况下解包。
template<typename ...Args>
void foo(Args... args) {
int dummy[] = {
(bar(args), 0)...
};
}
它按预期运行良好,但我的编译器总是警告我 dummy 未使用。
所以我担心编译器会删除dummy(因为它没有被使用并且实际上只由文字初始化),导致不调用bar。
或者仅仅将dummy 声明为volatile 就足以保证bar 被调用?
我知道有 [[maybe_unused]] 属性,但它也是 C++17 的特性。
【问题讨论】:
-
什么是“优化安全”?您是否担心优化会删除未使用的部分并由此改变代码的行为?
-
@largest_prime_is_463035818 是的,我担心编译器是否会删除
dummy并导致不调用bar
标签: c++ optimization c++14 variadic argument-unpacking