gpt4 book ai didi

c++ - 为什么链接器不会在下面的代码中发出错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:34 26 4
gpt4 key购买 nike

我找到了下面的例子 here .显然,代码片段中的注释是错误的,因为变量 S::x 被表达式 &S::x 使用了 odr。

struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
int main(){
f();
}

参见 live example

我知道编译器不需要发出这样的错误,因为 [basic.def.odr]/10说“不需要诊断”。但是为什么链接器没有像下面的代码那样发出关于 undefined variable S::x 的错误?

#include<iostream>
struct S { static const int x = 1; } s;

int main() {
std::cout << &s.x << '\n';
}

参见 live example .

最佳答案

But why doesn't the linker emit an error about the undefined variable S::x, as it does in the code below?

因为简直优化掉了!结果从未使用且没有副作用的表达式将被忽略。被忽略的内容不得链接进来。根本没有引用该变量的代码,即使它的地址已被获取但随后未被使用也是如此。

如您的 wandbox 示例所示,编译器发出正确的诊断信息:“未使用的表达式结果”。

未使用的代码以后不会导致链接器错误;)

您的第二个示例使用值(var 的地址),因此需要计算表达式。这会向链接器发出代码,其中无法在任何地方找到地址符号。

关于c++ - 为什么链接器不会在下面的代码中发出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585644/

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