通过函数安全传递引用?

时间:2013-04-29 13:05:09

标签: c++ c++11

以下函数在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(如果它不在给定的上下文中)?

  • 是否有可能在避免的同时提供同等但安全的功能 复制还是搬家?

5 个答案:

答案 0 :(得分: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
  

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

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

答案 1 :(得分:4)

您的临时对象将保持“活跃”状态,直到;cout开始,因此 使用方式这很安全。

答案 2 :(得分:2)

是的,这很安全。 “A”和“B”的字符串临时值将一直存在,直到“序列点”结束,即分号。

答案 3 :(得分:1)

  

是否保证临时字符串对象也不会被销毁   不久

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

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

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

答案 4 :(得分:0)

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