带指针的C++嵌套指定初始值设定项
我认为能够使用指定的初始化程序初始化一个引用另一个结构体的结构体会很有用。这种模式经常发生在某些 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]) 的最后一步,该表达式(词法上)包含它们的创建点。...