使元组保持const引用或const值

时间:2012-06-29 10:41:41

标签: c++ c++11

我正在尝试制作一个std::tuple最终持有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 ness?

1 个答案:

答案 0 :(得分:1)

它无效,因为T1 const添加了顶级const。即,它会生成double &const,这与double&没有区别。你需要一个内部const:“引用到const T1”。

您可以使用remove_referenceadd_constadd_reference的组合来构建它,或者只写一个将const放在正确位置的小特征:< / p>

template <typename T>
struct constify { using type = T; };
// needs a better name

template <typename T>
struct constify<T&> { using type = T const&; };

// and an alias for UX ;)
template <typename T>
using Constify = typename constify<T>::type;