我有一个函数:
void AddImage(const Image &im);
这个函数不需要修改图像,但它会将图像存储为常量引用以供以后使用。因此,该函数不应允许临时变量。如果没有任何预防措施,以下内容将有效:
Image GetImage();
...
AddImage(GetImage());
有没有办法阻止这个函数调用?
我有一个函数:
void AddImage(const Image &im);
这个函数不需要修改图像,但它会将图像存储为常量引用以供以后使用。因此,该函数不应允许临时变量。如果没有任何预防措施,以下内容将有效:
Image GetImage();
...
AddImage(GetImage());
有几种机制可以防止将临时变量传递给const引用参数。
删除带有r-value参数的重载:void AddImage(const Image &&) = delete;
使用const指针:void AddImage(const Image*)
。这种方法适用于C++11之前的版本。
使用reference wrapper:void AddImage(std::reference_wrapper<const Image>)
当使用支持C++11的编译器时,应首选第一种方法。它可以使意图更加明确。第二种方法需要运行时检查nullptr
,并且不传达图像不能为空的想法。第三种方法可行且表达了意图,但过于显式。
std::reference_wrapper
在这种情况下的工作原理,我将不胜感激。如果参数是临时对象std::string
,并且函数返回指向其.data()
的指针,会发生什么?它在这种情况下能正常工作吗? - Kostiantyn Ponomarenko