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

C++ 将临时变量的地址传递给带有指针参数的函数是否合法,c++,c++11,c++17,C++,C++11,C++17,将临时对象的地址传递给接受指针的函数是否合法。如果没有,在标准中,它在哪里说这是UB。具体而言,我希望确认以下代码是合法的,不包含未定义的行为: #include <memory> template <class T> inline const T* unsafe_addressof(const T&& x) { return std::addressof(x); } struct S {}; // NOTE: p only used unti

将临时对象的地址传递给接受指针的函数是否合法。如果没有,在标准中,它在哪里说这是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;
}

是的,你甚至不必让它保持不变

现在,unsafe_addressof将返回指向数组的指针、指向临时对象的指针、指向左值的指针,或者您试图让它返回指向的任何其他对象


指针的有效期是指向的对象的有效期,可以是prvalue、xvalue或左值的临时实例化。

。你不会被捕的。@SvSv你确定吗?有人可能会编写一个编译器,在任何UB上为程序员的滔天罪行提供框架。我不认为这有UB,虽然。复制,甚至也,谢谢你的回答。在这里删除引用的优点是什么?std::addressof不使用remove_reference。@kalc我记不起当您将指针指向引用时会发生什么,也不想学习;我觉得它很管用。当T与*@kalc结合时,引用将被删除,这是我必须测试和阅读标准才能检查的事情。我也不确定。我认为它会首先调用垃圾收集器,然后将指针指向引用,以确保裁判没有死亡。但我可能错了。
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;
}