我在这里找到下面的例子。显然,代码段中的注释是错误的,因为该变量S::x
已由表达式使用&S::x
。
struct S { static const int x = 1; };
void f() { &S::x; } // discarded-value expression does not odr-use S::x
int main(){
f();
}
查看现场示例
我了解编译器不需要发出此类错误,因为[basic.def.odr] / 10表示“无需诊断”。但是,为什么链接器不发出未定义变量的错误S::x
,如下面的代码所示?
#include<iostream>
struct S { static const int x = 1; } s;
int main() {
std::cout << &s.x << '\n';
}
参见现场示例。
但是,为什么链接器不会像下面的代码中那样发出未定义变量S :: x的错误?
因为它只是被优化了!结果永远不会使用且没有副作用的表达式将被忽略。并且被忽略的内容也不能链接进来。根本没有代码引用该变量,即使该变量的地址已被使用但未被使用也是如此。
如您的wandbox示例所示,编译器发出正确的诊断信息:“未使用表达式结果”。
未使用的代码以后不会导致链接器错误;)
您的第二个示例使用值(var的地址),因此需要评估表达式。这会向链接器发出代码,该链接器在任何地方都找不到地址的符号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句