来自不同翻译单元的约束函数会干扰吗?

问题描述 投票:0回答:3

我正在尝试研究一个函数为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

也许不是我们想要的,但至少我可以解释。

  1. 不需要编译器在编译时计算constexpr函数的结果,因此决定将其推迟到运行时。
  2. 函数上的[constexpr暗指inline] >>
  3. 我们的get()函数碰巧具有不同的实现
  4. 我们没有将get()函数声明为静态
  5. 链接器只能选择get()功能的一种实现
  6. 并且碰巧链接程序从get()中选择了main.cpp,并返回3。

现在我不了解的部分。我只是get()功能从constexpr更改为consteval

。现在,要求编译器在编译期间(即链接时间之前)计算值(对吗?)。我希望get()函数根本不会出现在目标文件中。

但是当我运行它(demo)时,我的输出完全相同

!怎么可能呢?..是的,我理解这是未定义的行为,但这不是重点。应该在编译时计算的值如何干扰其他转换单元?]

我正在尝试深入研究内联函数并偶然发现此问题的含义。考虑这个小程序(演示):/ * ---------- main.cpp ---------- * / void other(); constexpr int get(...

c++ constexpr c++20 one-definition-rule consteval
3个回答
4
投票

具有相同内联函数的两个定义的程序是格式错误的程序,不需要诊断。


5
投票
consteval函数的要求是对其的每次调用都必须产生一个常量表达式。

0
投票
答案是,无论函数是constexpr还是consteval,它仍然违反ODR。也许使用特定的编译器和特定的代码,您可能会得到期望的答案,但是它仍然格式不正确,不需要诊断。
© www.soinside.com 2019 - 2024. All rights reserved.