通过 const& 和 & 将对象传递给同一个函数
Posted
技术标签:
【中文标题】通过 const& 和 & 将对象传递给同一个函数【英文标题】:passing an object by const& and by & to the same function 【发布时间】:2014-11-16 12:06:32 【问题描述】:我有一个声明为
的图像函数thresholding( const Image &imgSrc, Image &imgDest );
如果我这样做会发生什么;
Image img;
tresholding( img, img );
这是明确定义的吗?因为在这种情况下img
被更改了。
P.S: threshold
读取 imgSrc
如果 `imgSrc[i] imgDest[i] = 255 else imgDest[i] = 0
更准确地说:
__m128i _mm_src = _mm_load_si128 ( any_value );
__m128i _mm_src = _mm_load_si128 ( (__m128i*) &imgSrc[0] );
__m128i _mm_dest = _mm_load_si128 ( (__m128i*) &imgDest[0] );
_mm_dest = mm_cmpgt_epi16 (a, thr);
【问题讨论】:
“这个定义明确吗?” 什么应该是未定义的? 我想您想在第二个代码块中调用函数treshold
而不是 thresholding
和 Image img()
是一个函数声明。
@JN11 完全正确,谢谢。
【参考方案1】:
对一个对象有多个可能不同类型的引用(就像有多个指向同一个对象的指针一样)没有问题。函数的行为也可能很好:像
这样的表达式imgDest[i] = (imgSrc[i] < lowerThr) * 255;
对于引用同一对象的imgSrc
和imgDest
是明确定义的。测序没有问题。发生。不过,您应该检查threshold
的文档或源代码,但也可以肯定——它可能以要求imgSrc
在整个执行过程中保持不变的方式实现。您不应该在不了解实现的情况下做出假设。
【讨论】:
编译器是否只检查 imgSrc 对象是否通过 imgSrc 更改? @user1235183 你什么意思?如果函数的行为是无意义的或未定义的,编译器不会发出诊断。检查文档。【参考方案2】:这是否定义良好取决于函数的规范。该语言允许对同一个对象进行多次引用,即使有些是const
-qualified 而有些则不是,但许多函数却没有。通过imgDest
进行的任何修改将立即通过imgSrc
可见,并且许多与您的参数相似的函数假设在修改imgDest
后,原始图像仍然在imgSrc
中可用.如果你的函数做出这样的假设,那么很容易说语言允许这样的调用,但这就像说语言允许printf(NULL);
:当然,从技术上讲确实如此,但如果你还考虑函数的规范,那就是仍然未定义。
【讨论】:
以上是关于通过 const& 和 & 将对象传递给同一个函数的主要内容,如果未能解决你的问题,请参考以下文章
将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象