18

以下函数在 C++03 或 C++11 中是安全的还是表现出 UB?

string const &min(string const &a, string const &b) {
    return a < b ? a : b;
}

int main() {
    cout << min("A", "B");
}
  • 是否可以返回对通过引用传递给函数的对象的引用?

  • 是否保证临时string对象不会过早销毁?

  • 给定的函数是否有 min可能表现出 UB(如果它不在给定的上下文中)?

  • 是否可以在避免复制或移动的同时制作等效但安全的功能?

4

5 回答 5

29

是否可以返回对通过引用传递给函数的对象的引用?

只要在您通过该引用访问对象之前未销毁该对象,就可以。

是否保证临时string对象不会过早销毁?

在这种情况下,是的。一个临时的持续到创建它的完整表达式的末尾,所以它在被流式传输到之后才会cout被销毁。

给定的函数 min 是否有可能表现出 UB(如果它不在给定的上下文中)?

是的,这是一个例子:

auto const & r = min("A", "B"); // r is a reference to one of the temporaries
cout << r;                      // Whoops! Both temporaries have been destroyed

是否可以在避免复制或移动的同时制作等效但安全的功能?

我不这么认为;但只要您不保留对其结果的引用,此函数是安全的。

于 2013-04-29T13:09:25.273 回答
4

您的临时对象将保持“活动”状态,直到;coutin main 结束,所以这种使用它的方式是安全的。

于 2013-04-29T13:08:04.220 回答
2

是的,它是安全的。“A”和“B”的字符串 temp 将一直存在到“序列点”的末尾,即分号。

于 2013-04-29T13:07:56.760 回答
1

是否保证临时字符串对象不会过早销毁

对于您的具体情况,是的,但对于以下代码,否

int main() {
    const string &tempString(min("A", "B"));
    cout << tempString;
}

除此之外,我同意“Mike Seymour”所说的话。

于 2013-04-29T13:12:56.260 回答
0

是的,通过函数传递引用是安全的,因为在您按值传递的参数中始终进行的更改以及在上面的代码中,A 和 B 的字符串 temps 将一直存在,直到分号的“序列点”结束但在通过引用传递的情况下,在该参数的副本中所做的更改不在原始副本中。

于 2013-05-06T05:15:45.383 回答