1

我正在尝试制作一个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东西?

4

1 回答 1

1

它不起作用,因为T1 const添加了顶级const. 即,它将使double &const,这与 没有什么不同double&。您需要一个内部 const:“对 const T1 的引用”。

remove_reference您可以使用,add_const和的组合来构建它add_reference,或者只是编写一个将 放在const正确位置的小特征:

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;
于 2012-06-29T11:01:01.787 回答