1

使用对象的引用作为别名总是安全的吗?例如,一个字符串:

std::string test;
std::string &reftest( test );
std::cout << "test before: " << test << "\n";
std::cout << "reftest before: " << reftest << "\n";
reftest = "abc";
std::cout << "test after: " << test << "\n";
std::cout << "reftest after: " << reftest << "\n";

是否保证 reftest 和 test 将始终具有相同的字符串?

4

5 回答 5

4

如果您将参考视为昵称,这会有所帮助。即使你在说reftest,你仍然的是test。所以,简而言之,是的。

请注意,有一些限制。例如,以下不是标准的:

std::string &reftest( std::string("test") );

但是这个

const std::string &reftest( std::string("test") );

是,因为 const 引用可以绑定到临时对象,而非 const 引用不能。

于 2012-05-17T20:32:19.500 回答
4

它们同一个字符串,就像一个叫罗伯特的人叫鲍勃一样。

正如您所说,这只是同一事物的两个名称-别名。

于 2012-05-17T20:32:50.373 回答
3

是的。这两个名称指的是同一个对象。

尽管名称之间存在一些差异。例如decltype(reftest),不会产生与 相同的类型decltype(test)

正如其他人指出的那样,有一些方法可以获得不合法使用的引用,但在这些情况下,这是因为引用不是合法变量的别名。

于 2012-05-17T20:32:29.057 回答
3

在你的例子中是的,但有一些陷阱:

struct X {
  std::string& s;
  X(std::string& s) : s(s) {}
};
struct Y {
  std::string s;
};

int main() {
  Y* y = new Y();
  X x(y->s);
  delete y;
  // now, x.s is dangling, as it refers to y->s, which is gone.
  std::cout << x.s << std::endl; // <- segfault
  return 0;
}
于 2012-05-17T20:34:11.267 回答
0

是的。它们都指向内存中的相同位置。输出每个变量的地址,你会看到这个。

于 2012-05-17T20:31:50.067 回答