b***i 发帖数: 3043 | 1 我们项目中有很多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删掉后就不能正常使用了。
这种是不是得告诉公司,不能这么写啊?虽然现在没有问题,主要是这些代码没有被调
用过。 |
h**l 发帖数: 168 | 2 你是对的,这样做不对。
其实不用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 发帖数: 10166 | 3 这是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. |
h**l 发帖数: 168 | 4 也可能是被compiler直接inline了,这样就和招Bihai的人说的是一种情况。但我还是
觉得不用reference好一些。 |
b***i 发帖数: 3043 | 5 招我的人承认他说的不对了。这个应该是visual studio可能允许正常运行(没试过)
,但是gcc会出错。有的出segmentation fault, 有的是SIGSEGV, 有时候显示错误的
值。
【在 h**l 的大作中提到】 : 也可能是被compiler直接inline了,这样就和招Bihai的人说的是一种情况。但我还是 : 觉得不用reference好一些。
|
b***i 发帖数: 3043 | 6 我发现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());
}
【在 h**l 的大作中提到】 : 你是对的,这样做不对。 : 其实不用reference, RVO就可以用上了,用reference啥好处都没有啊。 : 如果这种错误还有人反对修改的话你应该考虑换个公司了,公司环境和同事水平对你影 : 响很大的。。。
|
p***o 发帖数: 1252 | 7 这明摆着不是return local stack object。
【在 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()); : }
|
b***i 发帖数: 3043 | 8 是吗?我们的VS为什么报warning呢?
【在 p***o 的大作中提到】 : 这明摆着不是return local stack object。
|
h**l 发帖数: 168 | 9 这个函数大多数时候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()); : }
|
C*********r 发帖数: 21 | 10 被书本洗脑了吧 这不就是人家告诉你的extend var lifecycle么 谁告诉你effective
c++ 就是标准了 |
h**********c 发帖数: 4120 | 11 你返回的函数空间的引用,就是一个指针,
这个指针指向的内存被释放以后,被别的程序使用就是一个security hole.
这种问题,画c语言的stack图很好理解。实际应用我记得think in cpp 十要求返回必
须是const,不能是const & |
b***i 发帖数: 3043 | 12 既然有时候会返回一个临时的对象,那这个编译器的警告是应该的了?
看到微软的论坛上有人责问微软,微软说他们的编译器正确进行了警告。然后那个人说
,你们的警告信息太不清晰了。微软说要努力提高信息度。但是双方都认为这个boost
的库有问题。
虽然,这个param_not_found()是一个空的类的对象,什么信息也没有,所以估计也不
会有问题。但是我们要把警告当错误,这样就无法编译通过了吧
object
【在 h**l 的大作中提到】 : 这个函数大多数时候return的是caller函数传进去的参数,是没有问题的。也许在某种 : 特殊情况下会return param_not_found()这样一个default constructed local object : . 但我怀疑在实际使用中没有出现过这种情况。。。 : 你说这个boost库编译会有warning?
|