这个问题可能没有意义,但我还是会举个例子来问。此代码是否表现出未定义的行为?
int main() {
int a, b; // uninitialised
memcpy(&a, &b, sizeof(int));
}
我通常会说是,因为导致未初始化对象的左值到右值转换是 UB,必须将 b
的字节复制到 a
.
但是,memcpy
可能会也可能不会在 C++ 中实现。例如,如果 memcpy
是用汇编编写的,则没有这样的规则。如果程序将违规操作外包给具有不同规则的其他语言,那么执行通常会导致未定义行为的程序是否仍然会导致未定义行为?
最佳答案
这有点像在问“在 C++ 中,过度烧焦牛排会导致未定义行为吗?”
所有未定义行为意味着 C++(或 C 等)标准不保证在翻译和/或执行程序时会发生什么。毫不奇怪,C++ 标准对其他语言的函数没有太多说明。
唯一有点相关的引用来自 7.4
The
asm
declaration is conditionally-supported; its meaning is implementation-defined.
从 7.5 开始
[In a linkage-specification syntax...] This International Standard specifies the semantics for the string-literals
"C"
and"C++"
. Use of a string-literal other than"C"
or"C++"
is conditionally-supported, with implementation-defined semantics.
所以基本上,可以将其他语言与 C++ 一起使用,但本文档不打算讨论这一点,除了将各个部分粘合在一起所必需的语法之外。
从 C++ 标准的角度来看,来自其他语言的函数对 C++ 程序具有实现定义的影响。实现定义的通常被认为比未定义的行为更好,尽管不可移植。但是,使用 C++ 和 C 以外的东西不一定可移植到每个 C++ 实现,这不足为奇。
关于c++ - 用其他语言编写的函数是否受关于 UB 的 C++ 规则的约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739520/