b*i
2 楼
我们项目中有很多warning,其中有大量我认为是错误的,比如
const MyClass& GetSome(){
return MyClass(... constructor);
}
这种虽说编译不出错,但是是不是不对?
我跟招我那个人讨论过,他说以前是编译直接出错,现在警告,但是C++11可以允许。
他说,这是extend the life time of temporary。
但是 我认为他说的 不对 。他说的 其实 是
const MyClasss& abc = someFunc(); // someFunc() returns an object
而 例子 中 是返回一个引用,但是把刚刚构造的临时(rValue)对象返回了引用是堆
栈错误。这个我试过了,是Undefined。我同事有个演示,能正常使用。我把他
constructor里面的std::cout删掉后就不能正常使用了。
这种是不是得告诉公司,不能这么写啊?虽然现在没有问题,主要是这些代码没有被调
用过。
const MyClass& GetSome(){
return MyClass(... constructor);
}
这种虽说编译不出错,但是是不是不对?
我跟招我那个人讨论过,他说以前是编译直接出错,现在警告,但是C++11可以允许。
他说,这是extend the life time of temporary。
但是 我认为他说的 不对 。他说的 其实 是
const MyClasss& abc = someFunc(); // someFunc() returns an object
而 例子 中 是返回一个引用,但是把刚刚构造的临时(rValue)对象返回了引用是堆
栈错误。这个我试过了,是Undefined。我同事有个演示,能正常使用。我把他
constructor里面的std::cout删掉后就不能正常使用了。
这种是不是得告诉公司,不能这么写啊?虽然现在没有问题,主要是这些代码没有被调
用过。
h*l
3 楼
你是对的,这样做不对。
其实不用reference, RVO就可以用上了,用reference啥好处都没有啊。
如果这种错误还有人反对修改的话你应该考虑换个公司了,公司环境和同事水平对你影
响很大的。。。
【在 b***i 的大作中提到】
: 我们项目中有很多warning,其中有大量我认为是错误的,比如
: const MyClass& GetSome(){
: return MyClass(... constructor);
: }
: 这种虽说编译不出错,但是是不是不对?
: 我跟招我那个人讨论过,他说以前是编译直接出错,现在警告,但是C++11可以允许。
: 他说,这是extend the life time of temporary。
: 但是 我认为他说的 不对 。他说的 其实 是
: const MyClasss& abc = someFunc(); // someFunc() returns an object
: 而 例子 中 是返回一个引用,但是把刚刚构造的临时(rValue)对象返回了引用是堆
其实不用reference, RVO就可以用上了,用reference啥好处都没有啊。
如果这种错误还有人反对修改的话你应该考虑换个公司了,公司环境和同事水平对你影
响很大的。。。
【在 b***i 的大作中提到】
: 我们项目中有很多warning,其中有大量我认为是错误的,比如
: const MyClass& GetSome(){
: return MyClass(... constructor);
: }
: 这种虽说编译不出错,但是是不是不对?
: 我跟招我那个人讨论过,他说以前是编译直接出错,现在警告,但是C++11可以允许。
: 他说,这是extend the life time of temporary。
: 但是 我认为他说的 不对 。他说的 其实 是
: const MyClasss& abc = someFunc(); // someFunc() returns an object
: 而 例子 中 是返回一个引用,但是把刚刚构造的临时(rValue)对象返回了引用是堆
y*b
4 楼
这是C++经典错误之一了,早年effective c++一书有详细解释:
Item 21: Don't try to return a reference when you must return an object
Never return a pointer or reference to a local stack object, a reference to
a heap-allocated object, or a pointer or reference to a local static object
if there is a chance that more than one such object will be needed.
Item 21: Don't try to return a reference when you must return an object
Never return a pointer or reference to a local stack object, a reference to
a heap-allocated object, or a pointer or reference to a local static object
if there is a chance that more than one such object will be needed.
h*l
5 楼
也可能是被compiler直接inline了,这样就和招Bihai的人说的是一种情况。但我还是
觉得不用reference好一些。
觉得不用reference好一些。
h*l
10 楼
这个函数大多数时候return的是caller函数传进去的参数,是没有问题的。也许在某种
特殊情况下会return param_not_found()这样一个default constructed local object
. 但我怀疑在实际使用中没有出现过这种情况。。。
你说这个boost库编译会有warning?
【在 b***i 的大作中提到】
: 我发现boost的库也是这样的,那它对吗?
: template
: inline
: const typename lookup_named_param_def::type&
: get_param(const Args& p, Tag){
: return lookup_named_param_def::
: get(p, param_not_found());
: }
特殊情况下会return param_not_found()这样一个default constructed local object
. 但我怀疑在实际使用中没有出现过这种情况。。。
你说这个boost库编译会有warning?
【在 b***i 的大作中提到】
: 我发现boost的库也是这样的,那它对吗?
: template
: inline
: const typename lookup_named_param_def
: get_param(const Args& p, Tag){
: return lookup_named_param_def
: get(p, param_not_found());
: }
C*r
11 楼
被书本洗脑了吧 这不就是人家告诉你的extend var lifecycle么 谁告诉你effective
c++ 就是标准了
c++ 就是标准了
h*c
12 楼
你返回的函数空间的引用,就是一个指针,
这个指针指向的内存被释放以后,被别的程序使用就是一个security hole.
这种问题,画c语言的stack图很好理解。实际应用我记得think in cpp 十要求返回必
须是const,不能是const &
这个指针指向的内存被释放以后,被别的程序使用就是一个security hole.
这种问题,画c语言的stack图很好理解。实际应用我记得think in cpp 十要求返回必
须是const,不能是const &
b*i
13 楼
既然有时候会返回一个临时的对象,那这个编译器的警告是应该的了?
看到微软的论坛上有人责问微软,微软说他们的编译器正确进行了警告。然后那个人说
,你们的警告信息太不清晰了。微软说要努力提高信息度。但是双方都认为这个boost
的库有问题。
虽然,这个param_not_found()是一个空的类的对象,什么信息也没有,所以估计也不
会有问题。但是我们要把警告当错误,这样就无法编译通过了吧
object
【在 h**l 的大作中提到】
: 这个函数大多数时候return的是caller函数传进去的参数,是没有问题的。也许在某种
: 特殊情况下会return param_not_found()这样一个default constructed local object
: . 但我怀疑在实际使用中没有出现过这种情况。。。
: 你说这个boost库编译会有warning?
看到微软的论坛上有人责问微软,微软说他们的编译器正确进行了警告。然后那个人说
,你们的警告信息太不清晰了。微软说要努力提高信息度。但是双方都认为这个boost
的库有问题。
虽然,这个param_not_found()是一个空的类的对象,什么信息也没有,所以估计也不
会有问题。但是我们要把警告当错误,这样就无法编译通过了吧
object
【在 h**l 的大作中提到】
: 这个函数大多数时候return的是caller函数传进去的参数,是没有问题的。也许在某种
: 特殊情况下会return param_not_found()这样一个default constructed local object
: . 但我怀疑在实际使用中没有出现过这种情况。。。
: 你说这个boost库编译会有warning?
相关阅读
大数据全军覆灭发现IE 10连发两个websocket message,第二个自动丢失太喜欢plotly了请教 怎么实现保存搜索结果的URLpython数据处理的一个问题Job openings for SWE of all levels, and more (转载)js和ruby的语法都很漂亮还是我那句话,不作不死Kotlin 1.0发布了 没人关心?能把pc上的单机程序转成online的么?请教一下,各位牛人觉得Rust语言怎么样?H1B抽签前夕,湾区IT公司相继大裁员,大家都怎么看?何去何从 (转载)knuth讲过,越流行的东西 越要摒弃替朋友的公司帮找两位资深Java Server端高手 (转载)我觉得王垠对Agile的看法很有道理啊两年前面过一次LinkedIn,经历过的最傻逼的一次面试 (转载)阳光底下无新鲜事,软件业这些新制度早玩过了发个面试题怎样在Python里调用Visual C++的函数?python 读写google 搜素的内容,总是被拒?