【发布时间】:2020-10-06 06:12:09
【问题描述】:
据说std::abs 在标准中不是constexpr(即使在 C++20 中也是如此)。但在实践中,我发现在函数模板化的非常特殊的条件下,我可以将其编译为constexpr。请参阅这个完整的工作示例:
template<class T>
constexpr T f(const T input) {
return std::abs(input);
}
int main() {
int i = -1;
int a = f(i);
return 0;
}
代码:
- 无论有没有模板,都可以使用 GCC 正常编译。
- 它在 Clang 中不起作用。
- 在 Visual Studio 中,它使用模板行进行编译,但在没有模板的情况下编译失败。
【问题讨论】:
-
不,它确实有效!即使在调用时。我已经在不知不觉中使用了这个“技巧”。
-
Clang 抱怨这两种情况。
-
这能回答你的问题吗? Why isn't abs constexpr?
-
尝试在 MSVC 中将
constexpr添加到您的i和a- 它可以编译吗?如果不是,那么f就不是真正的constexpr函数。 -
“我的意思是,如果它像那样编译,它仍然是 constexpr” - 不,不是那个意思。如果实例化不是 constexpr,则声明为
constexpr的模板“回退”为非 constexpr
标签: c++ constexpr function-templates