C ++规范是否指定in 的顺序operator new
和构造函数。
g ++的顺序为-> -> ,而clang ++ 的顺序为-> -> 。
差异是由未指定的行为引起的吗?A
new C(A())
A()
new
C()
new
A()
C()
g ++:7.4.0 clang ++: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());
}
3
您要构建为C ++ 17,C ++ 14或更低版本吗?
—
StoryTeller-Unslander Monica,
两个注意事项:您用“ C”标记了该标记,这清楚地表明您没有阅读该标记的描述。别。现在,您询问“未定义的行为”(UB)。这是C ++标准使用的术语,用于标记可能发生任何事情并且应避免的事情。还有一种“未指明的行为”,它可能更接近您所追求的,因为该代码在技术上是可以正常使用的,并且不会导致UB。
—
Ulrich Eckhardt
@Ulrich Eckhardt谢谢您的建议。我把两者混在一起。
—
eddie kuo