【问题标题】:passing an object by const& and by & to the same function通过 const& 和 & 将对象传递给同一个函数
【发布时间】: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 完全正确,谢谢。

标签: c++ const-correctness


【解决方案1】:

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

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

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

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2012-07-07
    相关资源
    最近更新 更多