通过const&传递一个对象和&相同的功能

时间:2014-11-16 12:06:33

标签: c++ const-correctness

我有一个声明为

的图像功能
thresholding( const Image &imgSrc, Image &imgDest );

如果我这样做会发生什么;

Image img;
tresholding( img, img );

这个定义明确吗?因为在这种情况下img已更改。

P.S:threshold读取imgSrc,如果`imgSrc [i]< lowerThr - > 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);

2 个答案:

答案 0 :(得分:4)

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

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

是针对imgSrcimgDest明确定义的,指的是同一个对象。测序没有问题。发生。您应该检查threshold的文档或来源,但也可以确定 - 它可能以需要imgSrc在整个执行过程中保持不变的方式实现。你不应该在不知道实施的情况下做出假设。

答案 1 :(得分:4)

这是否定义明确取决于功能的规格。该语言允许多个引用同一个对象,即使有些是const - 合格而其他不是,但许多函数没有。通过imgDest进行的任何修改都会立即通过imgSrc显示,并且许多参数与您的参数相似的函数假设在修改imgDest后,原始图像为仍然可以在imgSrc中找到。如果你的函数做了这样的假设,那么很容易说语言允许这样的调用,但这就像说语言允许printf(NULL);:确定,技术上它确实如此,但如果你也考虑函数的规范,那仍然是未定义的。