以下函数在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(如果它不在给定的上下文中)?
是否有可能在避免的同时提供同等但安全的功能 复制还是搬家?
答案 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的临时值将一直存在,直到'序列点'结束为止是分号但是在通过引用传递的情况下,该参数副本中所做的更改不在原始副本中。