DOES C ++は、順序指定SPEC operator new
とのコンストラクタA
でをnew C(A())
。
g ++は順序をA()
-> new
-> C()
にしますが、clang ++はそれを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
2つのメモ:これに「C」のタグを付けました。これは、そのタグの説明を読んでいないことを明確に示しています。しないでください。次に、「未定義の動作」(UB)について質問します。これは、C ++標準で使用される用語であり、何かが発生する可能性があること、および回避すべきことを示します。「不特定の動作」もあり、コードは技術的に問題がなく、UBを引き起こさないため、おそらくあなたが求めているものに近いでしょう。
—
Ulrich Eckhardt
@Ulrich Eckhardtご提案ありがとうございます。2つを混ぜました。
—
eddie kuo