簡體   English   中英

帶指針的 C++ 嵌套指定初始值設定項

[英]C++ nested designated initializer with pointer

我認為能夠使用指定的初始化程序初始化一個引用另一個結構體的結構體會很有用。 這種模式經常發生在某些 API(例如 Vulkan)中。 例如,考慮以下結構:

struct A {
    int v;
};

struct B {
    int v;
    A* a;
};

struct C {
    B* b;
};

和一個以C為參數的函數

void func(const C& c) {}

我想出了一種使用unmove() ( ref ) 函數將右值轉換為左值的方法:

template <typename T>
T& unmove(T&& v) { return v; }

使用這個函數,嵌套的初始化可以寫成

func({
    .b = &unmove(B{
        .v = 1,
        .a = &unmove(A{
            .v = 2
        })
    })
});

我的問題:就標准而言,它是函數的有效用法嗎? 或者我錯過了什么?

只要函數不存儲或返回引用的對象或其地址或嵌套的指針以供以后使用,這就是安全的。 臨時對象將在完整表達式結束時銷毀,因此提到的存儲/返回的引用/指針將無效。

[類.臨時]

... 臨時對象被銷毀作為評估完整表達式 ([intro.execution]) 的最后一步,該表達式(詞法上)包含它們的創建點。 ...

我會把它addressof_rvalue

template <typename T>
T* addressof_rvalue(T&& v) { return std::addressof(v); }
template <typename T>
T* addressof_rvalue(T& v) = delete;

它是安全的,只要指針不超過您正在調用的函數。

func({
    .b = addressof_rvalue(B{
        .v = 1,
        .a = addressof_rvalue(A{
            .v = 2
        })
    })
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM