将临时地址传递给带有指针参数的函数是否合法
Is it legal to pass the address of a temporary to a function with a pointer argument
将
临时对象的地址传递给接受指针的函数是否合法?如果不是,标准中的哪个地方说这是 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 值还是左值中临时实例化。
相关文章:
- 使用指向成员的指针将成员函数作为参数传递
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 修改函数中的指针(将另一个指针作为参数传递)
- Clang bug?使用指针作为模板参数
- MSVC将仅移动结构参数解释为指针
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何使用非类型模板参数传入指向数组的指针
- 将成员函数指针作为参数传递给模板方法
- 匹配函数指针作为模板参数?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 通过智能指针和转换对基本模板参数进行模板推导
- 为函数定义符号不明确的指针参数
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 将函数参数完美转发到函数指针:按值传递呢?
- 保留函数指针模板参数
- 如何构造一个以可变参数指针函数作为成员的类?
- 指向对象的非类型模板参数指针
- c++ 使用 *& as 参数(指针乐趣,三级树方法)