通过函数安全传递引用?

Jur*_*aho 18 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");
}
Run Code Online (Sandbox Code Playgroud)
  • 可以通过引用返回对传递给函数的对象的引用吗?

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

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

  • 是否有可能在避免复制或移动的同时提供同等但安全的功能?

Mik*_*our 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
Run Code Online (Sandbox Code Playgroud)

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

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