【发布时间】:2021-06-19 20:23:34
【问题描述】:
我认为能够使用指定的初始化程序来初始化一个用指针引用另一个结构的结构会很有用。这种模式经常发生在某些 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
})
})
});
我的问题:就标准而言,它是该功能的有效用法吗?还是我错过了什么?
【问题讨论】:
-
那些临时对象存在直到
;然后所有指针都悬空 - 阅读您链接的完整答案,尤其是 "...如果函数返回一个引用,它比完整表达式的寿命更长,它变成了一个悬空引用......". -
这能回答你的问题吗? Rvalue to lvalue conversion?
-
我认为在这种情况下,更大的考虑是其他程序员(或以后的你自己)想知道到底发生了什么——即使合法,也很难认可这一点
标签: c++ language-lawyer c++20