[英]C++11 - tuple and move semantics
這個示例代碼應該編譯嗎? clang
和g++
接受它,而icc 14
拒絕這樣做,抱怨auto t = ...
std::unique_ptr
的拷貝構造函數是未定義的。
#include <iostream>
#include <memory>
#include <tuple>
std::tuple<std::unique_ptr<int[]>, int> foo()
{
std::unique_ptr<int[]> a;
unsigned int b;
auto t = std::make_tuple(std::move(a), b);
return std::move(t);
}
int main()
{
foo();
}
我認為它應該編譯: std::make_tuple()
的結果是一個臨時的std::tuple<T...>
,它應該移動構造它的成員。 更准確地說, std::tuple<T...>
的移動構造函數是默認的,這應該導致成員移動構造。
顯然,沒有必要將std::make_tuple()
的結果std::make_tuple()
t
。 如果您選擇引入此變量,則返回時不應該std::move(t)
:當return
語句中的表達式是局部變量時,無論如何它都被視為rvalue。 但是,額外的std::move()
禁止復制/移動省略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.