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?
相关阅读
invalid opcode只有executable能debug吗?内存管理的问题那个C#面试题的文件C++ (direct vs indirect initialization)问个图的问题anyone using boost.asio?R question:收集整理的一些算法编程面试问题(pdf格式)numerical recipes in C++有人用过吗?What does this mean in C++windows桌面画图刷新一问C++ template function default argument 很怪?virtural memory low是怎么回事儿从Google输入法谈微软及其它 (转载)[合集] 关于求解链表中环的起始位置问题XML有什么好的editorBloomberg on line test 之后?对pthread熟悉的XD请进来看看windows scripts