if constexpr 在 C 17 中的非模板化函数中的行为与预期不同
在 C 17 中,if constexpr 语句允许条件基于编译时常量表达式的编译。但是,当尝试在非模板化函数中使用此功能时,可能会出现意外的编译错误。
考虑以下代码片段:
<code class="cpp">#include <iostream> #include <type_traits> int main() { auto value = 100; if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; // Error else std::cout << "Ref to " << value << std::endl; }</code>
编译此代码时,会出现错误发生在尝试在 if constexpr 语句中取消引用“value”的行上。这是因为非模板化函数不支持 if constexpr。
为什么只有模板?
此行为是设计使然。 if constexpr 旨在防止基于特定专业化的无效模板代码的实例化。在提供的示例中,非模板化函数使用 std::is_pointer_v
解决方案
在非中使用 if constexpr模板化上下文,请考虑将代码包装在模板函数中或使用在编译时表现不同的宏。例如:
<code class="cpp">#include <iostream> #include <type_traits> template<typename T> void print(T value) { if constexpr (std::is_pointer_v<T>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { auto n = 1000; print(n); int *ptr = &n; print(ptr); }</code>
在这种情况下,打印函数是模板化的,因此如果基于模板参数正确应用 constexpr 行为。
以上是为什么 `if constexpr` 在 C 17 中的非模板化函数中不起作用?的详细内容。更多信息请关注PHP中文网其他相关文章!