我正在尝试研究一个函数为inline
的含义,并偶然发现了这个问题。考虑这个小程序(demo):
/* ---------- main.cpp ---------- */
void other();
constexpr int get()
{
return 3;
}
int main()
{
std::cout << get() << std::endl;
other();
}
/* ---------- other.cpp ---------- */
constexpr int get()
{
return 4;
}
void other()
{
std::cout << get() << std::endl;
}
当编译时不进行优化,程序将产生以下输出:
3
3
也许不是我们想要的,但至少我可以解释。
constexpr
函数的结果,因此决定将其推迟到运行时。 constexpr
暗指inline
] >>get()
函数碰巧具有不同的实现get()
函数声明为静态get()
功能的一种实现并且碰巧链接程序从get()
中选择了main.cpp
,并返回3。
现在我不了解的部分。我只是get()
功能从constexpr
更改为consteval
get()
函数根本不会出现在目标文件中。但是当我运行它(demo)时,我的输出完全相同
!怎么可能呢?..是的,我理解这是未定义的行为,但这不是重点。应该在编译时计算的值如何干扰其他转换单元?]我正在尝试深入研究内联函数并偶然发现此问题的含义。考虑这个小程序(演示):/ * ---------- main.cpp ---------- * / void other(); constexpr int get(...
具有相同内联函数的两个定义的程序是格式错误的程序,不需要诊断。
consteval
函数的要求是对其的每次调用都必须产生一个常量表达式。constexpr
还是consteval
,它仍然违反ODR。也许使用特定的编译器和特定的代码,您可能会得到期望的答案,但是它仍然格式不正确,不需要诊断。