在 C 17 中的非模板化函数中使用“If constexpr”时出错
在 C 17 中,“if constexpr”语句允许基于常量表达式有条件地评估和编译代码。但是,此功能在非模板化函数中使用时有限制。
代码:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; }</code>
问题:
当“if constexpr”在非模板化函数中使用时,如上所示,尝试取消引用非指针值时会发生编译错误。出现此错误的原因是,与模板化函数不同,非模板化函数中的“if constexpr”不会阻止编译未采用的代码路径。
说明:
在模板化函数中,“if constexpr”允许根据模板参数的值有条件地编译代码。在这种情况下,编译器可以在编译时确定模板对于给定的专业化是否有效,并且仅实例化必要的代码路径。
但是,在非模板化函数中,“if constexpr”仅充当运行时的条件语句。编译器仍然会分析条件语句的两个分支,如果未采取的分支中有任何代码无效,则会发生编译错误。
解决方案:
为了避免此错误,请仅在模板化函数或非模板化函数中使用“if constexpr”,其中类型在编译时已知,并且保证对条件语句的两个分支都有效。
以上是为什么“if constexpr”会导致 C 17 中的非模板化函数出现编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!