Chỉ có vấn đề trong trường hợp trình khởi tạo là cuộc gọi hàm trả về tham chiếu rvalue trong thời gian ngắn. Với ít từ hơn và nhiều mã hơn:
// Fine; lifetime extension applies!
auto&& ref = 42;
auto id = [](int&& i) -> int&& { return std::move(i); };
auto&& uhoh = id(42);
// uhoh is now a stale reference; can't touch it!
Ngược lại, auto uhoh = id(42);
sẽ hoạt động tốt.
Trong trường hợp của bạn, vì std::make_tuple
trả về một giá trị và không phải là tham chiếu rvalue, không có vấn đề gì.
Tôi cho rằng nguy hiểm thực sự là từ các hàm và mẫu chức năng với tham số tham chiếu rvalue và trả về tham chiếu rvalue cho tham số rvalue hoặc tham số phụ thuộc vào chúng. (Điều đó được nói, một cái gì đó đơn giản như auto&& ref = std::move(42);
trình bày vấn đề!)
Tình hình không hoàn toàn mới từ C++ 11, xem xét: T const& ref = bar(T_factory());
.
Nguồn
2013-02-13 08:39:47
Tham chiếu là tham chiếu. –
về 'auto && var = func()', http://stackoverflow.com/questions/13618506/is-it-possible-to-stdmove-objects-out-of-functions-c11/13618587#13618587 – billz
@billz link là một trường hợp khác khi nó trả về biến cục bộ làm tham chiếu. Lỗi là bên trong hàm không phải nơi nó được gọi. – balki