将临时对象的地址传递给带指针的函数是否合法。如果没有,标准中的哪个位置表示这是UB。具体来说,我想确认以下代码是合法的,并且不包含未定义的行为:
#include <memory>
template <class T>
inline const T* unsafe_addressof(const T&& x) {
return std::addressof(x);
}
struct S {};
// NOTE: p only used until f returns.
void f(const S* p);
int main() {
f(unsafe_addressof(S{}));
return 0;
}
答案 0 :(得分:1)
是的,你甚至不必做const
。
template <class T>
inline std::remove_reference_t<T>* unsafe_addressof(T&& x) {
return std::addressof(x);
}
struct S {};
// NOTE: p only used until f returns.
void f(const S* p);
int main() {
f(unsafe_addressof(S{}));
return 0;
}
现在unsafe_addressof
将返回一个指向数组的指针,指向临时指针,指向左值的指针,或者你试图让它返回指针的其他任何东西。
该指针有效期的生命周期是指向的事物的生命周期,可以是prvalue,xvalue或左值的临时实例化。