将临时地址传递给带有指针参数的函数是否合法

Is it legal to pass the address of a temporary to a function with a pointer argument

本文关键字:参数 指针 函数 是否 地址 址传      更新时间:2023-10-16

临时对象的地址传递给接受指针的函数是否合法?如果不是,标准中的哪个地方说这是 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;
}

是的,你甚至不必让它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、x 值还是左值中临时实例化。