如果 constexpr() 在 C++17 中给出错误
if constexpr() gives an error in C++17
我已经阅读了关于 constexpr
在 C++17 中使用这个 reference link.
然后,我编写了C++程序来测试constexpr
:
#include <iostream>
int i = 10;
int func()
{
if constexpr (i == 0)
return 0;
else if (i > 0)
return i;
else
return -1;
}
int main()
{
int ret = func();
std::cout<<"Ret : "<<ret<<std::endl;
}
但是,编译器报错:
main.cpp: In function 'int func()':
main.cpp:8:25: error: the value of 'i' is not usable in a constant expression
if constexpr (i == 0)
^
main.cpp:4:5: note: 'int i' is not const
int i = 10;
为什么报错?
if constexpr ( condition )
在编译时运行,因此 condition
必须是可评估的编译时。
int i = 0
不是常量变量,因此 i == 0
不是可评估的编译时间。
尝试使用 int const i = 0
或更好的 constexpr int i = 0
。
你误解了if constexpr
的意思。这不是要在运行时执行的 const 表达式的测试,而是要在编译时执行的逻辑表达式的测试。
该构造与预处理器的 #if
大致相似,因为其他分支以及可能无法编译的代码被删除。
这会起作用:
template<int i>
int func()
{
if constexpr (i == 0)
return 0;
else if constexpr (i > 0)
return i;
else
return -1;
}
编译器在编译时知道 i
的值,因此根据其值,三个分支中只有一个会保留在编译后的代码中。
我已经阅读了关于 constexpr
在 C++17 中使用这个 reference link.
然后,我编写了C++程序来测试constexpr
:
#include <iostream>
int i = 10;
int func()
{
if constexpr (i == 0)
return 0;
else if (i > 0)
return i;
else
return -1;
}
int main()
{
int ret = func();
std::cout<<"Ret : "<<ret<<std::endl;
}
但是,编译器报错:
main.cpp: In function 'int func()':
main.cpp:8:25: error: the value of 'i' is not usable in a constant expression
if constexpr (i == 0)
^
main.cpp:4:5: note: 'int i' is not const
int i = 10;
为什么报错?
if constexpr ( condition )
在编译时运行,因此 condition
必须是可评估的编译时。
int i = 0
不是常量变量,因此 i == 0
不是可评估的编译时间。
尝试使用 int const i = 0
或更好的 constexpr int i = 0
。
你误解了if constexpr
的意思。这不是要在运行时执行的 const 表达式的测试,而是要在编译时执行的逻辑表达式的测试。
该构造与预处理器的 #if
大致相似,因为其他分支以及可能无法编译的代码被删除。
这会起作用:
template<int i>
int func()
{
if constexpr (i == 0)
return 0;
else if constexpr (i > 0)
return i;
else
return -1;
}
编译器在编译时知道 i
的值,因此根据其值,三个分支中只有一个会保留在编译后的代码中。