[英]Compare std::variant with int using C++20 <=> is not a constant expression
[英]Is using malloc for int undefined behavior until C++20
有人告訴我,在 C++20 之前,以下代碼的行為未定義:
int *p = (int*)malloc(sizeof(int));
*p = 10;
真的嗎?
爭論是int
object 的生命周期在分配值之前沒有開始( P0593R6 )。 要解決此問題,應使用放置new
:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
我們真的必須調用一個默認構造函數來啟動 object 的生命周期嗎?
同時,代碼在純 C 中沒有未定義的行為。 但是,如果我在 C 代碼中分配一個int
並在 C++ 代碼中使用它怎么辦?
// C source code:
int *alloc_int(void)
{
int *p = (int*)malloc(sizeof(int));
*p = 10;
return p;
}
// C++ source code:
extern "C" int *alloc_int(void);
auto p = alloc_int();
*p = 20;
它仍然是未定義的行為嗎?
這是真的嗎?
是的。 從技術上講,不屬於:
int *p = (int*)malloc(sizeof(int));
實際上創建了一個int
類型的 object ,因此取消引用p
是 UB,因為那里沒有實際的int
。
我們真的必須調用默認構造函數來啟動 object 的生命周期嗎?
您是否必須按照 C++ object model 來避免 C++20 之前的未定義行為? 是的。 如果您不這樣做,任何編譯器實際上會造成傷害嗎? 不是我知道的。
[...] 它仍然是未定義的行為嗎?
是的。 在 C++20 之前,您實際上還沒有在任何地方創建int
object 所以這是 UB。
是的,是UB。 枚舉了int
可以存在的方式列表,但沒有一個適用於此,除非您認為 malloc 是非因果的。
它被廣泛認為是標准中的一個缺陷,但重要性不高,因為 C++ 編譯器圍繞 UB 的特定位所做的優化不會導致該用例出現問題。
至於第二個問題,C++ 沒有規定 C++ 和 C 如何交互。 因此,與 C 的所有交互都是... UB,也就是 C++ 標准未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.