【发布时间】:2015-03-16 15:52:47
【问题描述】:
想象一个期望对 std::unique_ptr 进行右值引用的函数。
void foo(std::unique_ptr<int>&& a);
在我的真实示例中,参数不止一个,因此我决定使用右值引用的std::tuple<T&&> 将参数转发给它 - 所以std::forward_as_tuple:
void forward_to_foo(std::tuple<std::unique_ptr<int>&&>&& t);
int main() {
forward_to_foo(std::forward_as_tuple(std::make_unique<int>(8)));
}
目前一切正常。
当我想“解包”这个元组时出现问题
void forward_to_foo(std::tuple<std::unique_ptr<int>&&>&& t)
{
foo(std::get<0>(t));
}
我在使用 c++14 的 gcc4.9 上遇到了这个错误:
error: cannot bind 'std::unique_ptr<int>' lvalue to 'std::unique_ptr<int>&&'
foo(std::get<0>(t));
我的问题:这里有什么问题?为什么右值引用元组中的std::get<I>(t)返回左值?
【问题讨论】:
-
因为
t是一个左值。使用std::get<0>(std::move(t));。 -
std::tuple<std::unique_ptr<int>&&> t = std::forward_as_tuple<std::make_unique<int>(8));- 这给出了一个悬空引用,所以是 UB。 -
您能否发布没有不相关语法错误的代码?简化,然后在简化的代码中实际重现问题。如果您简化为有不同问题的代码,或者没有您的问题,那么代码通常比无用更糟糕。 MCVE 可能会有所帮助。
-
@ecatmur - 我希望我修好了。
-
@piotr 发布的代码中仍然存在不相关的语法错误。请发布实际产生您所询问的错误的代码。将其放入编译器,然后编译。你的括号甚至不匹配!
标签: c++ c++11 tuples unique-ptr