考慮下面的代碼:完美轉發和std ::元組
#include <iostream>
#include <tuple>
#include <utility>
// A.
template <typename... Args>
void f (const char* msg, Args&&... args)
{
std::cout << "A. " << msg << "\n";
}
// B.
template <typename... Args>
void f (const char* msg, std::tuple<Args...>&& t)
{
std::cout << "B. " << msg << "\n";
}
struct boo
{
const std::tuple<int, int, long> g() const
{
return std::make_tuple(2, 4, 12345);
}
};
int main()
{
f("First", 2, 5, 12345);
f("Second", std::make_tuple(2, 5, 12345));
boo the_boo;
f("Third", the_boo.g());
f("Fourth", std::forward<decltype(std::declval<boo>().g())>(the_boo.g()));
return 0;
}
的輸出將是:
A. First
B. Second
A. Third
A. Fourth
從它的明顯,它不這樣做,我想什麼輸出它要做的,就是我想第三個和第四個要經過B.版本的函數。 The std ::轉發從第四電話是多餘的,因爲完美的轉發不會發生在那裏。爲了擁有完美的轉發我知道:
- 我必須在一個類型推導上下文
- 參數的類型的右值引用必須是功能
我明白了一個模板類型這是行不通的。但我不充分掌握:
爲什麼上下文是通過使用的std ::元組在這樣一種方式,它不能根據需要工作改變了嗎?爲什麼模板參數不能用於另一個模板類型的 ?
我該如何(優雅地)修復它?
有更大的問題'B'是你的非const右值引用不能綁定到一個const右值。 – 2015-02-11 09:50:38
我明白了。編譯器告訴我同樣的事情(修改一些代碼)。我只是看不到如何解決它。 – celavek 2015-02-11 09:53:38
沒有'g'返回一個const元組? (爲什麼它會返回一個呢?) – 2015-02-11 09:58:49