gpt4 book ai didi

ios - 如何允许将 C++98 API 的临时值转换为左值

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:22:11 26 4
gpt4 key购买 nike

我有 C++98 API,它通过非 const 引用 获取一个值并更改该值。
具体来说,我使用的是 OpenCV,函数是 cv::rectangle(),它需要绘制 cv::Mat & 图像。

同一 API 还使用表达式模板来优化图像算法。我可以通过创建一个表示子图像的(非常量)临时包装对象在感兴趣区域 (ROI) 上绘制一个矩形。

使用 VS2010,我可以写:

cv::Mat a(10,10,CV_8UC1); // create 10x10 image
Rect rec(0,0,2,2); // create 2x2 rectangle
cv::rectangle(a, rec, cv::Scalar::all(0)); // (1) draw 2x2 on full image
cv::rectangle(a(rec), rec, cv::Scalar::all(0)); // (2) draw 2x2 on 2x2 sub-image << !!!

这没有问题。在第 (2) 行,一个临时的子图像包装器对象被创建并通过引用传递给 cv::rectangle

但是,在 XCode for iOS 上使用 Clang 支持 C++11,第 (2) 行给出以下错误:

.../test.cpp:605:5: No matching function for call to 'rectangle'
.../core.hpp:2594:17: Candidate function not viable: expects an l-value for 1st argument

为了完整性,这里是相关的原型(prototype):

//! draws the rectangle outline or a solid rectangle covering rec in the image
CV_EXPORTS void rectangle(CV_IN_OUT Mat& img, Rect rec,
const Scalar& color, int thickness=1,
int lineType=8, int shift=0);

我认为发生这种情况是因为 a(rec) 创建了一个由 ref 传递给 cv::rectangle 的临时文件,而编译器不允许这个临时文件是转换为左值。也许这个临时文件自动定义为常量?
我确实传递了一个临时文件,但临时文件是实际非常量左值的包装器,应该允许自由更改。

有没有办法告诉 Clang 放宽这些约束?
是否有可能以某种方式告诉编译器这些 header 来自 C++98 库,因此应该像 C++98 中那样处理临时文件?类似于 extern "C"?
有没有办法允许将临时值转换为左值。

当然,我可以编写 auto b=a(rec) 并传递 b,但这会用一堆命名的临时对象填充代码并击败包装类的用途。

最佳答案

自己回答...经过更多研究后,这种行为似乎是由标准规定的,而 VS2010 在这里不符合标准。
此行为旨在防止意外错误,尽管我的用例实际上是标准禁止的有效用例的示例。

规则:非常量临时对象绑定(bind)到非常量-const 引用。
const 临时对象的不同之处在于,您可以在临时对象上调用非 const 方法。
如果这样的方法返回,例如*this ,那么那个结果是一个左值,因此将绑定(bind)到非常量引用。

有关详细信息,请参阅 herehere .

正如@Xeo 上面的评论,在 C++11 中,还可以编写一个从 r-valuel-value 的转换器:template<class T> T& as_lvalue(T&& v){ return v; } // add 'hazard' icon .
但是,应格外小心(或根本不用)。

关于ios - 如何允许将 C++98 API 的临时值转换为左值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22168980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com