gpt4 book ai didi

c++ - 可以在编译时评估使用 std::is_same<> 的条件吗?

转载 作者:行者123 更新时间:2023-11-30 02:21:12 25 4
gpt4 key购买 nike

我知道constexpr函数不必在编译时求值,但如果可能的话。是下面的条件if是否在编译时评估?

template <typename T> inline std::string toString(const T& arg, int decPlaces) 
{
if (!std::is_same<T, float>::value && !std::is_same<T, double>::value)
return std::to_string(arg);
// Else go on strip digits after decimal point
}

我知道在 C++17 中有 if constexpr这保证在编译时进行评估,但我只是想知道在这种情况下它是否可以在编译时进行评估,因为 boolis_same 返回是constexpr .比如不能使用C++17的情况。

最佳答案

考虑一下你的代码的这个稍微修改的版本(这样控制流就不能到达这样一个非void函数的结尾):

template <typename T> inline std::string toString(const T& arg, int decPlaces) 
{
if (!std::is_same<T, float>::value && !std::is_same<T, double>::value)
return std::to_string(arg);

return ""; // <-- added
}

通过显式实例化 T=float 的模板函数:

template std::string toString<float>(const float&, int);

然后在启用g++ 6.4.0 和启用-O2 的情况下编译它,为x86 生成以下汇编代码 平台:

__Z8toStringIfESsRKT_i:
pushl %ebx
subl $40, %esp
movl 48(%esp), %ebx
leal 31(%esp), %eax
movl $LC0, 4(%esp)
movl %eax, 8(%esp)
movl %ebx, (%esp)
call __ZNSsC1EPKcRKSaIcE
addl $40, %esp
movl %ebx, %eax
popl %ebx
ret $4

上面的代码中没有条件

所以,对于这个编译器和平台,条件实际上是在编译时评估的。您可以针对目标编译器和平台进行类似操作。

关于c++ - 可以在编译时评估使用 std::is_same<> 的条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48762257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com