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

时间:2017-10-26 16:48:02

标签: 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 until f returns.
void f(const S* p);

int main() {
    f(unsafe_addressof(S{}));
    return 0;
}

1 个答案:

答案 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或左值的临时实例化。