1
我試圖做一個std::tuple
,最終保存const
引用,或者是一個值被複制或移動的適當的地方,如果引用不是明智的(例如臨時)。讓一個元組保持一個const引用或一個常量值
到目前爲止我有:
#include <functional>
#include <iostream>
template <typename ...Args>
struct foo {
const std::tuple<Args...> values;
};
template <typename T1, typename T2>
foo<T1, T2> make2(T1&& v1, T2&& v2) {
return foo<T1,T2>{std::tuple<T1, T2>(std::forward<T1>(v1),std::forward<T2>(v2))};
}
int main() {
double d1=1000;
double& d2 = d1;
auto f = make2(d2, 0);
std::cout << std::get<0>(f.values) << ", " << std::get<1>(f.values) << "\n";
d1 = -666;
std::get<0>(f.values)=0; // Allowed - how can I inject some more constness into references?
//std::get<1>(f.values) = -1; // Prohibited because values is const
std::cout << std::get<0>(f.values) << ", " << std::get<1>(f.values) << "\n";
}
這是接近,但並不完全const
夠了我的希望 - 當然,我結束了一個const std::tuple<double&, int>
,讓我修改兩倍的元組指的是。
我試圖灑些const
內斯到make2
:
template <typename T1, typename T2>
foo<T1 const, T2 const> make2(T1&& v1, T2&& v2) {
return foo<T1 const,T2 const>{std::tuple<T1 const, T2 const>(std::forward<T1>(v1),std::forward<T2>(v2))};
}
這成功地使int
(即非基準)元組成員const
(不是非常令人興奮的給我可以讓整個元組const
很輕鬆了),但沒有對double&
成員做任何事情。爲什麼?我如何添加額外的const
?