【发布时间】:2023-03-29 20:00:01
【问题描述】:
C++ 规范是否在new C(A()) 中指定了operator new 的顺序和A 的构造函数。
g++ 让顺序为 A() -> new -> C(),但 clang++ 让它为 new -> A() -> C()。
差异是由未指定的行为引起的吗?
g++ :7.4.0 铿锵++:10.0.0
#include <iostream>
#include <cstdlib>
struct A {
A() {
std::cout << "call A()\n";
}
};
struct C {
C(A) {
std::cout << "call S()\n";
}
void *operator new(size_t s) {
std::cout << "call new()\n";
return malloc(s);
}
};
int main() {
void *p = new C(A());
}
【问题讨论】:
-
您是使用 C++17、C++14 还是之前的版本构建?
-
两个注意事项:你用“C”标记了这个,这清楚地表明你没有阅读该标记的描述。别。现在,您询问“未定义的行为”(UB)。这是 C++ 标准使用的一个术语,用于标记任何事情都可能发生并且应该避免的事情。还有“未指定的行为”,这可能更接近您所追求的,因为代码在技术上很好并且不会导致 UB。
-
@Ulrich Eckhardt 谢谢你的建议。我把两者混在一起了。
标签: c++ language-lawyer c++17 order-of-execution