|
|
1
2
你有
这不会编译。
我们可以移除
但当我们遇到不明确的行为时
有了这个签名,调用就变成了UB
|
|
|
2
1
对
(C17 6.5.2.4/1) 和
(C17 6.3.2.1/1)
因此
那个
是的,在所提供的特定函数调用中。 规则是:
(C17 6.5/2) 特别要注意的是,这一规定是根据被访问的对象给出的,而不是通过其执行访问的lvalues。
这很奇怪。 6.5.2.4/1是一个语言约束,因此诊断违规是C实现的一致性要求。我的GCC确实对此进行了诊断:
如果你的不这样做,就会出问题。 另一方面,6.5/2是 不 语言约束,在实践中,编译器在这种情况下可能无法识别UB。诊断此问题不需要实现。我没有发现任何选项组合能引起GCC对这一问题的诊断。 |
|
|
3
0
它会编译,也不会编译(
https://godbolt.org/z/Mfjf6bsMq
),但没有UB,因为将没有可执行文件以定义或未定义的方式进行行为。但是,如果您修改程序以将引用传递给
它将调用 未定义的行为 .
只有将引用传递给同一对象时,才能对其进行未定义:
|