edd*_*kuo 9 c++ language-lawyer order-of-execution c++17
C++ 规范是否指定了in的顺序operator new和构造函数。
g++ 让顺序为-> -> ,但 clang++ 让它为-> -> 。
差异是由未指定的行为引起的吗?Anew C(A())A()newC()newA()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());
}
Run Code Online (Sandbox Code Playgroud)
son*_*yao 11
叮当是对的。从 C++17 开始,执行顺序是有保证的。[expr.new]/19
分配函数的调用在new-initializer 中的表达式求值之前进行排序。
operator new(分配函数)应该首先被调用,然后在新初始化器(即A())中对表达式求值。
在 C++17 之前,不保证顺序。[expr.new]/18 (C++14)
分配函数的调用相对于new-initializer中表达式的评估是不确定的。
似乎 gcc 不符合 C++17(及更高版本);在 C++2a 模式下用gcc10编译给出相同的结果。
| 归档时间: |
|
| 查看次数: |
545 次 |
| 最近记录: |