【发布时间】:2019-06-15 07:16:54
【问题描述】:
我有一个函数可以从 storage-ptr 中移动一个 int:
int&& MoveFromStorage(void const* p)
{
return static_cast<int&&>(*static_cast<int*>(const_cast<void*>(p)));
}
int main()
{
int i = 10;
int&& iRValRef = MoveFromStorage(&i);
}
使用 MSVC 2017 编译此函数会导致 warning C4172: returning address of local variable or temporary。我没有使用 clang 或 gcc 收到此警告。我没有看到我在哪里返回局部变量或临时地址。这是 MSVC 中的错误吗?
编辑
也许我可以提供更多上下文:我自己编写了一个 std::variant 并为访问函数编写了以下代码:
template<class AlternativeType>
inline AlternativeType _cast_to(void const* variant_storage)
{
typedef typename std::remove_reference<AlternativeType>::type without_ref;
return static_cast<AlternativeType>(*static_cast<without_ref*>(const_cast<void*>(variant_storage)));
}
template<class AlternativeType, class Visitor>
inline auto _visit_impl(Visitor&& vis, void const* variant_storage)
-> decltype(std::forward<Visitor>(vis)(_cast_to<AlternativeType>(variant_storage)))
{
return std::forward<Visitor>(vis)(_cast_to<AlternativeType>(variant_storage));
}
然后我通过填充数组来使用这些函数:
FPtrType arr[] = { _visit_impl<QualifiedCurrentType>... };
而 QualifiedCurrentType 变体的第 I 个类型具有应用的变体的常量性和引用性。 IE。如果变体通过 r-value-ref 传递,则 QualifiedCurrentType 将是某个其他类型的 RvalueRef。对于这些情况,_cast_to 会生成警告。
【问题讨论】:
-
Visual Studio 是对的,
&&的返回类型很奇怪 -
对我来说看起来不错。超级奇怪,但很好。
-
你真的需要移动一个int吗?
标签: c++