'reference'typedef的确如何表现?

Meh*_*dad 5 c++ stl typedef reference

STL容器有一个referenceconst_reference typedef,在很多情况下我见过(容器bool是我能想到的唯一例外),可以简单地定义为

typedef value_type& reference;
typedef const value_type& const_reference;
Run Code Online (Sandbox Code Playgroud)

但是,这些类型的语义到底是什么?

根据我的理解,他们应该"表现得像对价值类型的引用",但究竟是什么意思呢?

MSDN说这reference是:

一种类型,提供对存储在向量中的元素的引用.

但究竟是什么意思呢?他们需要超载特定的运营商,还是有特定的行为?如果是这样,所需的行为是什么?

Pub*_*bby 1

你问的是“我可以总是取消引用引用吗?是的,你可以。这意味着取消引用reference可以做所有取消引用可以做的事情value_type&,这就是一切都value_type可以做的事情。如果这对你来说有意义的话。


您不能重载 typedef 上的运算符。typedef 与分配给它们的类型具有相同的行为。它们被 typedef 的原因是为了让它们不那么麻烦并提供一个通用的“接口”

存在的原因reference是为了防止这样的事情发生:

template<typename T>
struct foo {
  T& bar();

  typedef T& reference;
  reference baz();
}

foo<int> x;
foo<int>::T& y = x.bar(); // error! returns a T& but I can't create one!
foo<int>::reference z = x.baz(); // ok! 
Run Code Online (Sandbox Code Playgroud)

它还提供了更清晰的界面并允许使用 SFINAE:

template<typename T>
typename T::reference second(T::reference& t) { return t.at(1); };

template<typename T>
T& second(T& t) { return t[1]; };

std::vector v(10);
foo f(10); // type with [] overloaded but no reference typedef
second(x) = 5; // calls first def
second(f) = 3; // calls second def
Run Code Online (Sandbox Code Playgroud)

  • 那么当你可以只使用“value_type&amp;”时,使用“reference”有什么意义,如果它们是相同的东西呢?“引用”必须满足“必须”有一组必要和充分的条件,这当然不是“一切”...... (2认同)
  • “引用必须满足一组必要且充分的条件,这当然不是“一切”......”为什么?“引用”的最初意图是成为“可转换”类型的东西。但标准容器不允许这样做。因此,“reference”必须是“value_type&amp;”。并非 C++ 中存在的所有事物都必须有原因。有时,这只是某种以某种方式产生的结果。 (2认同)