通过 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 而不是 thresholdingImage img() 是一个函数声明。 @JN11 完全正确,谢谢。 【参考方案1】:

对一个对象有多个可能不同类型的引用(就像有多个指向同一个对象的指针一样)没有问题。函数的行为也可能很好:像

这样的表达式
imgDest[i] = (imgSrc[i] < lowerThr) * 255;

对于引用同一对象的imgSrcimgDest 是明确定义的。测序没有问题。发生。不过,您应该检查threshold 的文档或源代码,但也可以肯定——它可能以要求imgSrc 在整个执行过程中保持不变的方式实现。您不应该在不了解实现的情况下做出假设。

【讨论】:

编译器是否只检查 imgSrc 对象是否通过 imgSrc 更改? @user1235183 你什么意思?如果函数的行为是无意义的或未定义的,编译器不会发出诊断。检查文档。【参考方案2】:

这是否定义良好取决于函数的规范。该语言允许对同一个对象进行多次引用,即使有些是const-qualified 而有些则不是,但许多函数却没有。通过imgDest 进行的任何修改将立即通过imgSrc 可见,并且许多与您的参数相似的函数假设在修改imgDest 后,原始图像仍然在imgSrc 中可用.如果你的函数做出这样的假设,那么很容易说语言允许这样的调用,但这就像说语言允许printf(NULL);:当然,从技术上讲确实如此,但如果你还考虑函数的规范,那就是仍然未定义。

【讨论】:

以上是关于通过 const& 和 & 将对象传递给同一个函数的主要内容,如果未能解决你的问题,请参考以下文章

将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象

ES6:对象增强写法&解构&let/const

ES6:对象增强写法&解构&let/const

为啥 lambda auto& 参数选择 const 重载?

通过 const& 和 & 将对象传递给同一个函数

CPP_const&static