我试图深入研究函数存在的含义inline
并偶然发现了这个问题。考虑这个小程序(演示):
/* ---------- 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()
from main.cpp
,它返回了 3。
现在到我不明白的部分。我只是将get()
功能从更改constexpr
为consteval
。现在编译器需要在编译期间计算值,即在链接时间之前(对吗?)。我希望get()
函数根本不存在于目标文件中。
但是当我运行它(演示)时,我有完全相同的输出!这怎么可能?.. 我的意思是,我知道这是未定义的行为,但这不是重点。为什么应该在编译时计算的值会干扰其他翻译单元?
UPD:我知道这个功能在 clang 中被列为未实现,但这个问题仍然适用。是否允许符合标准的编译器表现出这种行为?