【发布时间】:2022-01-12 08:59:49
【问题描述】:
我想根据模板 bool 参数有条件地在函数中声明一个局部变量。因此,如果它是真的,它应该在那里,否则不应该在那里,因为我不希望该变量在堆栈上分配内存或调用其构造函数。也可以是基本类型。
我不能在 constexpr if 块中声明它,因为我需要在用法之间保持持久性。
- 我可以只声明变量并添加 [[maybe_unused]]。那么,是否有编译器优化保证不为变量分配内存?
template <bool T> void foo()
{
[[maybe_unused]] SomeLargeClass x;
if constexpr(T)
{
... do something with x
}
... do something without x
if constexpr(T)
{
... do something more with x
}
}
- 我尝试将声明替换为
std::enable_if_t<T, SomeLargeClass> x;
但它不起作用,因为 T==false 案例无法提供类型。为什么这不是 SFINAE?
- 我还有其他选择吗?
【问题讨论】:
-
你的编译器实际生成了什么?未使用的变量可能会被优化掉,除非它们是非平凡的类型。
-
请记住,在 C++ 中,有 as-if 规则。您编写的代码只是对您想要完成的操作的描述——编译器生成的最终代码可能与源代码完全不同,只要程序产生正确的结果即可。这一切都归功于优化。声明未使用的变量——一个好的编译器会优化掉这些变量。
-
作为最后的手段,您始终可以专门化
foo(并将不需要可选变量的任何内容重构为单独的函数以避免重复) -
持久性是什么意思?
-
@PasserBy 我的意思是我需要函数范围内的任何地方的变量。它不应局限于 if 子句之类的子范围。
标签: c++ local-variables enable-if